HoneyTalk——我和我女朋友的專屬情侶聊天器

  • 2019 年 12 月 26 日
  • 筆記

其實這並不是什麼大不了的東西 就是想寫點東西 練練手 騙騙人 順帶着唬一唬你們 說道這個聊天器 不知道你們還記不記得這個

特別爛的Arduino聊天器 聰明的瓦肯人,公眾號:工業光線噓~~聽說有逼格的人都基於Arduino搭建個人聊天室了!

見過爛的 沒見過這麼爛的

當然 這本身就不是什麼主流玩意兒 一些軟件適配做的非常糟糕 也是在情理之中

Arduino聊天室是一個匿名群聊應用 但是今天的應用是一對一 專屬情侶聊天 話不多說 還不快來看看 1 情侶聊天 最重要的是什麼? 當然是隱私 隱私是什麼 隱私就是隱藏在個人心中的私事 由此看來 今天我們在社交軟件上說的 每一句話都掌握在第三方機構中 這還得了

so 我們急需重新定義個人聊天 尤其是情侶聊天 讓人民群眾掌握自己的信息 才是最大的幸福

所以 為了拯救人民於水深火熱之中 今天我(們)重磅推出 C2C聊天應用 HoneyTalk (以下簡稱HT)

HoneyTalk分為 He和She 實際上 HT是偽C2C,真S2C 因為其中一端就是服務端 直接將服務端作為客戶端的方式 繞過了第三方服務器 在最大程度上保護了隱私 所有數據只有對話雙方知道 當然這種方式增加了聯通的複雜性 這是因為以現狀來看 如果你想要聯通任何人 每人既需要服務端用來等待連接 也需要客戶端發起連接 非常不方便 目前看來 只適合情侶聊天這種單一簡單場景 我們先來看看界面

顯而易見

這高貴的0.9透明度

彰顯着年輕人的不拘一格 交互界面非常簡單 其中藍色界面是服務端界面 粉色界面是客戶端界面

1區是對話顯示區

2區是消息發送區 設計初衷一目了然 男生是服務端 女生是客戶端

但不僅僅如此

你們一定以為

作為服務器的男生一定佔據着主動

而女生則處處被動

確切的說

服務器是否運行確實決定了軟件是否運行

但是

作為寵妻狂魔

我……呃呃呃

emmmm~

不對呀

嘴巴不受控制了

(不好意思,這是未來的事)

反正

我是不可能讓我廣大女朋友吃虧的

只要廣大女朋友

能說服你的直男啟動服務器

我小瓦就能幫你扳回一局

這是為什麼呢?

這是因為我小瓦賦予了

客戶端非常高的權限

什麼意思?

首先

服務器一旦啟動

男生沒有發起對話的權利

這一點很好理解

服務器總是在等待連接

只有當你心愛的女朋友

開心了、傷心了、寂寞了

打開了HT發起連接

服務器才響應啟動對話界面

可是很不幸

今天這個渣男非常不耐煩

企圖關掉對話界面

嘿嘿嘿!

不好意思你沒有這個權限

渣男不但沒有權限

而且這個危險的行為

會立刻被你女朋友知曉

可是如果情況恰恰相反

你的女朋友今天看你不爽

難得理你

她只需輕輕地抬起她的玉指

就可以了結此次對話

所有對話界面都將關閉

可是你還想你儂我儂

怎麼辦?

不要急,辦法總比困難多

這時候

你必須馬上送上

兄弟

聽我一句話

不在乎那點錢

保命要緊

2

介紹完了基本情況

再來點實在的

關於怎麼用的問題

當你下載了文件後

首先你需要注意的是

由於程序需要調用.ico圖標

所以你必須保證.ico圖片與程序在同一目錄下

然後

服務端很簡單

雙擊HoneyTalkHe.exe

等待一段時間,顯示基本信息

之後會隱藏在後台運行

要想關閉得去任務管理器進程界面

而客戶端

雙擊HoneyTalkShe.exe

等待之後出現如下

你需要輸入地址與端口

局域網下

你得去問問渣男地址

端口我已設好

只能是8888

公網下

渣男得去做socket內網穿透

地址與端口視情況而定

每一次填好後然後回車

最後等待連接

成功後就能快樂的私密的聊天了

最後

請不要重複啟動

那樣你將打開一個無用界面

3

送上代碼是我一向的原則

本次練手小項目

結合了Socket網絡編程與GUI編程

這其中有一些坑得親自去踩才有意義

公眾號發送「HT」獲得軟件

或者

github地址:https://github.com/xjc-jim/HoneyTalk

服務端:

#!/usr/bin/env python3  # 文件名:socket_fuWu.py  # 開發者:聰明的瓦肯人  # 微信公眾號:工業光線  # 個人主頁:http://www.tech-xjc.com    import socket  import time  import win32api  import win32gui  from tkinter import *  import threading  from tkinter import scrolledtext  from tkinter.messagebox import showerror  from tkinter.messagebox import showinfo    #回調函數事件  event = '<Return>'  error = '注意:對面的渣男試圖關閉對話框,已被攔截!'    # 創建 socket 對象  s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    #獲取本機電腦名  myname = socket.gethostname()  #獲取本機ip  myaddr = socket.gethostbyname(myname)    print(myname)  print(myaddr)  s.bind((myaddr,8888))    s.listen(1)  print("waiting......")  print('5秒後將隱藏窗口!')  time.sleep(5)    #隱藏控制台窗口  ct = win32api.GetConsoleTitle()  hd = win32gui.FindWindow(0,ct)  win32gui.ShowWindow(hd,0)  class GUI(object):      def __init__(self,root):          self.root = root          self.root.geometry('270x360')          self.root.resizable(width=False, height=False)          self.root.title('HoneyTalk_HE')          self.root.iconbitmap('boy.ico')          self.root['background'] = 'lightskyblue'          self.root.attributes('-alpha',0.9)          # 檢測關閉按鈕          self.root.protocol('WM_DELETE_WINDOW',self.close)          self.entry = Entry(self.root)          self.entry.place(x=10,y=325)          # 檢測回車          self.entry.bind("<Return>",self.callback)          self.button = Button(self.root,text = 'send',command = self.sending)          self.button.place(x=165,y=322)          self.button0 = Button(self.root,text = 'More',command = self.more)          self.button0.place(x=215,y=322)          self.sock = sock          self.out = scrolledtext.ScrolledText(self.root)          self.out.place(x=10,y=0,width=250)          #設置tag即插入文字的大小,顏色等          self.out.tag_config('tag0',foreground = 'hotpink')          self.out.tag_config('tag1',foreground = '#1E90FF')        def close(self):          try:              showerror('警告','渣男好大的膽,你無權關閉對話框!')              self.sock.send(error.encode('utf-8'))          except:              self.sock.send(error.encode('utf-8'))              pass          return        def sending(self):          content = self.entry.get()            if content != '':              self.out.config(state = 'normal')          self.out.insert(END,'HE:'+content+'nn','tag1')          self.out.see(END)          self.out.config(state = 'disable')            try:              self.sock.send(content.encode('utf-8'))              self.entry.delete(0,END)          except:              sock.shutdown(2)              sock.close()              pass        #回調函數      def callback(self,event):          content = self.entry.get()            if content != '':              self.out.config(state = 'normal')          self.out.insert(END,'HE:'+content+'nn','tag1')          self.out.see(END)          self.out.config(state = 'disable')            try:              self.sock.send(content.encode('utf-8'))              self.entry.delete(0,END)          except:              pass        def more(self):          try:              showinfo(title='關於',message='1.作者:聰明的瓦肯人 n2.公眾號:工業光線(GongYe_Light) n3.個人主頁:http://www.tech-xjc.com n4.公眾號發送「honeytalk」獲得詳細介紹 n5.網絡問題會造成回復延遲 n6.正常使用時請勿重複啟動 n7.請先啟動該服務器再啟動客戶端 n')          except:              pass    def create():      global gui      global root      root = Tk()      gui = GUI(root)    def rec():      while True:          try:              msg = sock.recv(1024)              gui.out.config(state = 'normal')              con = bytes.decode(msg)              gui.out.insert(END,'SHE:'+con+'nn','tag0')              gui.out.see(END)              gui.out.config(state = 'disable')          except:              sock.shutdown(2)              sock.close()              break      # 退出mainloop      root.quit()      if __name__ == '__main__':      while True:          sock,addr = s.accept()            t1 = threading.Thread(target = rec,name = 'rec')          t1.setDaemon(True)            create()          t1.start()          root.mainloop()          # 徹底關掉界面          root.destroy()

客戶端:

#!/usr/bin/env python3  # 文件名:socket_keHu.py  # 作者:聰明的瓦肯人  # 微信公眾號:工業光線  # 個人主頁:http://www.tech-xjc.com    # 導入 socket 等模塊  import os  import time  import socket  import sqlite3  import win32api  import win32gui  from tkinter import *  import threading  from tkinter import scrolledtext  from tkinter.messagebox import showinfo    adr = input('>>請輸入局域網或公網地址:')  port = input('>>請輸入局域網或公網端口:')  #回調函數事件  event = '<Return>'  error = '注意:對面的渣男試圖關閉對話框,已被攔截!'    # 創建 socket 對象  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 連接服務,指定主機和端口  try:      s.connect((adr, int(port)))      print('連接成功!')      print('5秒後隱藏窗口!')      time.sleep(5)        #隱藏控制台窗口      ct = win32api.GetConsoleTitle()      hd = win32gui.FindWindow(0,ct)      win32gui.ShowWindow(hd,0)  except:      print('連接失敗,地址端口錯誤或服務器未啟動!')      print('5秒後關閉程序')      time.sleep(5)      os._exit(0)    class GUI(object):      def __init__(self,root):          self.root = root          self.root.geometry('270x360')          self.root.resizable(width=False, height=False)          self.root.title('HoneyTalk_SHE')          self.root.iconbitmap('girl.ico')          self.root['background'] = 'pink'          self.root.attributes('-alpha',0.9)          self.root.protocol('WM_DELETE_WINDOW',self.close)          self.entry = Entry(self.root)          self.entry.place(x=10,y=325)          self.entry.bind("<Return>",self.callback)          self.button = Button(self.root,text = 'Send',command = self.send)          self.button.place(x=165,y=322)          self.button0 = Button(self.root,text = 'More',command = self.more)          self.button0.place(x=215,y=322)          self.out = scrolledtext.ScrolledText(self.root)          self.out.place(x=10,y=0,width=250)          #設置tag即插入文字的大小,顏色等          self.out.tag_config('tag0',foreground = 'hotpink')          self.out.tag_config('tag1',foreground = '#1E90FF')        def close(self):          #showinfo('提示','確認關閉程序嗎?')          s.close()          os._exit(0)        def send(self):          content = self.entry.get()            if content != '':              self.out.config(state = 'normal')          self.out.insert(END,'SHE:'+content+'nn','tag0')          self.out.see(END)          self.out.config(state = 'disable')            try:              s.send(content.encode('utf-8'))              self.entry.delete(0,END)          except:              pass        def callback(self,event):          content = self.entry.get()            if content != '':              self.out.config(state = 'normal')          self.out.insert(END,'SHE:'+content+'nn','tag0')          self.out.see(END)          self.out.config(state = 'disable')            try:              s.send(content.encode('utf-8'))              self.entry.delete(0,END)          except:              pass        def more(self):          showinfo(title='關於',message='1.作者:聰明的瓦肯人 n2.公眾號:工業光線(GongYe_Light) n3.個人主頁:http://www.tech-xjc.com n4.公眾號發送「honeytalk」獲得詳細介紹 n5.網絡問題會造成回復延遲 n6.正常使用時請勿重複啟動 n7.請先啟動服務器再啟動該客戶端 n')    def create():      global gui      global root      root = Tk()      gui = GUI(root)      root.mainloop()    def rec():      while True:          try:              msg = s.recv(1024)              gui.out.config(state = 'normal')              con = msg.decode('utf-8')                if con == error:                  gui.out.insert(END,con+'nn')              else:                  gui.out.insert(END,'HE:'+con+'nn','tag1')                gui.out.see(END)              gui.out.config(state = 'disable')          except:              gui.out.config(state = 'normal')              gui.out.insert(END,'啊哦~!服務器疑似下線!請敦促男友重啟!然後再重啟客戶端!nn')              gui.out.see(END)              gui.out.config(state = 'disable')              break    if __name__ == '__main__':      t1 = threading.Thread(target = create,name = 'create')      t1.start()      try:          rec()      except:          pass

over!