当前位置 博文首页 > python实现电子词典

    python实现电子词典

    作者:qq_41859277 时间:2021-06-13 17:46

    本文实例为大家分享了python实现电子词典的具体代码,供大家参考,具体内容如下

    # -*- coding: utf-8 -*-
    #youdanTest.py
    import urllib
    import json
     
    # 设置一个退出程序的出口
    isOut = False
     
    # 不断调用爬取翻译页面的功能
    # 直到isOut被设置为True,退出程序
     
     
    def query(keys):
     while True:
      if isOut == True:
       break
     
      # 假定用户输入“CloseMe”,则退出
      key = keys
      if key == "CloseMe":
       isOut = True
       continue # 回到循环开始处,然后结果条件满足退出
     
      # 做真正的查询操作
      url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
     
      # 构造headers
      headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
         "X-Requested-With": "XMLHttpRequest",
         "Accept": "application/json, text/javascript, */*; q=0.01",
         "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
         }
     
      # 把form数据转规范化,然后post给服务端
      formdata = {
       "i": key,
       "from": "AUTO",
       "to": "AUTO",
       "smartresult": "dict",
       "client": "fanyideskweb",
       "salt": "1523933959290",
       "sign": "248f5d216c45a64c38a3dccac0f4600d",
       "doctype": "json",
       "version": "2.1",
       "keyfrom": "fanyi.web",
       "action": "FY_BY_REALTIME",
       "typoResult": "false"
      }
      data = bytes(urllib.parse.urlencode(
          formdata),
          encoding="utf-8")
      # 给服务器发送post请求
      req = urllib.request.Request(url,
              data,
              headers,
              method="POST")
      response = urllib.request.urlopen(req)
      info = response.read().decode("utf-8")
      jsonLoads = json.loads(info)
      return jsonLoads['translateResult'][0][0]["tgt"]

    服务端

    #!/usr/bin/python3
    # coding=utf-8
     
     
    from signal import *
    from socket import *
    import pymysql
    from time import *
    import sys
    import os
    from youdaoTest import query
     
    def do_child(connfd, db):
     while True:
      msg = connfd.recv(128).decode()
      print("msg : ", msg)
     
     
      if msg[0] == 'R':
       do_register(connfd, msg, db)
     
     
      if msg[0] == 'L':
       do_login(connfd, msg, db)
     
     
      if msg[0] == 'Q':
       do_query(connfd, msg, db)
     
     
      if msg[0] == 'H':
       do_history(connfd, msg, db)
     
     
      if msg[0] == 'E':
       connfd.close()
       sys.exit(0)
     return
     
    def do_register(connfd, msg, db):
     print("in register.......")
     cursor = db.cursor()
     s = msg.split(' ')
     name = s[1]
     passwd = s[2]
     
     
     sql = "select * from user where name = '%s'" % name
     cursor.execute(sql)
     data = cursor.fetchone()
     print(data)
     
     
     if data != None:
      connfd.send("FALL".encode())
      return
     
     
     sql = "insert into user values ('%s','%s')" % (name, passwd)
     
     
     try:
      cursor.execute(sql)
      db.commit()
      connfd.send('OK'.encode())
     except:
      connfd.send("FALL".encode())
      db.rollback()
      return
     else:
      print("register OK !")
    
     
    def do_login(connfd, msg, db):
     print("in login.......")
     cursor = db.cursor()
     s = msg.split(' ')
     name = s[1]
     passwd = s[2]
     
     
     try:
      sql = "select * from user where name = '%s' and passwd = '%s'" % (
       name, passwd)
      cursor.execute(sql)
      data = cursor.fetchone()
      print(data)
     except:
      pass
     if data == None:
      connfd.send("FALL".encode())
     else:
      connfd.send('OK'.encode())
     return
     
    def do_query(connfd, msg, db):
     print("in query.......")
     start = time()
     cursor = db.cursor()
     s = msg.split(' ')
     words = s[1]
     name = s[2]
     msg = query(words)
     connfd.send(msg.encode())
     insert_history(db, words, name)
     
    def do_history(connfd, msg, db):
     print('in history...')
     s = msg.split(' ')
     name = s[1]
     cursor = db.cursor()
     sql = 'select * from history where name = "%s"' % name
     try:
      cursor.execute(sql)
      data = cursor.fetchall()
      connfd.send('OK'.encode())
     except:
      connfd.send('FALL'.encode())
     sleep(0.1)
     for msg in data:
      name = msg[0]
      word = msg[1]
      time = msg[2]
      sleep(0.01)
      connfd.send(('%s %s %s' % (name, word, time)).encode())
     sleep(0.1)
     connfd.send('over'.encode())
     
    def insert_history(db, words, name):
     time = ctime()
     cursor = db.cursor()
     sql = 'insert into history values ("%s","%s","%s")' % (name, words, time)
     try:
      cursor.execute(sql)
      db.commit()
     except:
      print('into history failed')
      db.rollback()
     
    def main():
     signal(SIGCHLD, SIG_IGN)
     db = pymysql.connect('localhost', 'root', '123456', 'dict')
     
     
     HOST = sys.argv[1]
     PORT = int(sys.argv[2])
     sockfd = socket()
     sockfd.bind((HOST, PORT))
     sockfd.listen(5)
     
     while True:
      try:
       connfd, addr = sockfd.accept()
       print("connect addr : ", addr)
      except KeyboardInterrupt:
       raise
      except:
       continue
     
      pid = os.fork()
      if pid < 0:
       print("create child process failed")
       connfd.close()
       continue
      elif pid == 0:
       sockfd.close()
       do_child(connfd, db)
      else:
       connfd.close()
       continue
     
     db.close()
     sockfd.close()
     sys.exit(0)
     
    if __name__ == "__main__":
     main()

    电子词典客户端

    #!/usr/bin/python
    # coding=utf-8
     
    from signal import *
    from socket import *
    from time import *
    import sys
    import os
     
     
    def do_register(sockfd, msg):
     name = input("input your user name >>")
     passwd = input("input your user passwd >>")
     msg = 'R %s %s' % (name, passwd)
     
     sockfd.send(msg.encode())
     msg = sockfd.recv(128).decode()
     
     if msg[0:2] == 'OK':
      return 0
     else:
      return -1
     
     
    def do_login(sockfd, msg):
     name = input("input your user name >>")
     passwd = input("input your user passwd >>")
     msg = 'L %s %s' % (name, passwd)
     
     sockfd.send(msg.encode())
     msg = sockfd.recv(128).decode()
     
     if msg[0:2] == 'OK':
      return name
     else:
      return -1
     
     
    def do_query(sockfd, msg, name):
     while True:
      word = input("input word >>")
     
      if word == '##':
       return
     
      msg = 'Q %s %s' % (word, name)
     
      sockfd.send(msg.encode())
      msg = sockfd.recv(128).decode()
     
      if msg[0:2] == 'OK':
       msg = sockfd.recv(1024).decode()
       if msg == " ":
        print("not found this word")
       print(msg)
       # elif msg[:11] == 'found error':
       #  print('found error')
       #  continue
     
      else:
       print("fail to query")
       continue
     
     
    def do_history(sockfd, msg, name):
     
     msg = 'H %s' % name
     sockfd.send(msg.encode())
     msg = sockfd.recv(128).decode()
     
     if msg[0:2] == 'OK':
      while True:
       data = sockfd.recv(1024).decode()
       if data == 'over':
        break
     
       print(data)
     else:
      print("fail to history")
      return -1
     
     
    def main():
     HOST = sys.argv[1]
     PORT = int(sys.argv[2])
     msg = None
     
     sockfd = socket()
     
     sockfd.connect((HOST, PORT))
     
     def login(name):
      while True:
       print('''
       ==========query commend=========
       ---1:查词 2:历史记录 3:退出---
       ================================
       ''')
       try:
        cmd = int(input("Input commend >> "))
       except:
        print("Input error!")
        continue
     
       if cmd not in [1, 2, 3]:
        print("input error!")
        sys.stdin.flush()
        continue
     
       if cmd == 1:
        do_query(sockfd, msg, name)
       if cmd == 2:
        do_history(sockfd, msg, name)
       if cmd == 3:
        break
      return
     
     while True:
      print('''
      =============Welcome=============
      ----1: 注册 2: 登陆 3: 退出----
      =================================
      ''')
      try:
       cmd = int(input("Input command >> "))
      except:
       print("Input error")
       continue
     
      if cmd not in [1, 2, 3]:
       print("input error!")
       sys.stdin.flush()
       continue
     
      if cmd == 1:
       if do_register(sockfd, msg) == 0:
        print("register OK!")
       else:
        print("register FALL")
      if cmd == 2:
       name = do_login(sockfd, msg)
       if name != -1:
        print("login OK!")
        login(name)
       else:
        print("register FALL")
      if cmd == 3:
       msg = 'E'
       sockfd.send(msg.encode())
       sockfd.close()
       sys.exit(0)
     
     
    if __name__ == "__main__":
     main()

    查词时将单词发送到网络上,从有道中查询出单词翻译再返回给客户端。

    js
    下一篇:没有了