You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.4 KiB
131 lines
3.4 KiB
#!/usr/bin/env python2
|
|
# -*- encoding: utf-8 -*-
|
|
|
|
import signal
|
|
import os
|
|
import requests
|
|
import json
|
|
import traceback
|
|
from random import randint as rand
|
|
|
|
|
|
value = {"timeout": 65535, "allowed_updates": ["message"]}
|
|
apiUrl = 'https://api.telegram.org/'
|
|
botID = 'bot278787962:AAET8HRGdtZ42C9vvbdChjh2Rv9pEUBqcYM'
|
|
baseUrl = apiUrl + botID
|
|
urlGetUpdate = baseUrl + '/getUpdates'
|
|
urlSendMessage = baseUrl + '/sendMessage'
|
|
urlSendSticker = baseUrl + '/sendSticker'
|
|
replyMsgArray = None
|
|
|
|
|
|
def dumpReplyMsgArray():
|
|
fdump = open('dictionary.json', 'w')
|
|
json.dump(replyMsgArray, fdump)
|
|
fdump.write('\n')
|
|
fdump.close()
|
|
|
|
|
|
def send(url, toSendMessage, printback):
|
|
attempt = 1
|
|
while True:
|
|
ret = requests.post(url, json=toSendMessage).text
|
|
if not ret:
|
|
attempt += 1
|
|
print("no reply.")
|
|
continue
|
|
retjson = json.loads(ret)
|
|
if True is retjson['ok']:
|
|
print(printback)
|
|
break
|
|
elif attempt > 3:
|
|
print("given up.")
|
|
else:
|
|
attempt += 1
|
|
print("failed: " + retjson['description'])
|
|
|
|
|
|
def sendMessage(chatid, replyto, message):
|
|
toSendMessage = {"chat_id": chatid, "reply_to_message_id": replyto}
|
|
if "text" in message:
|
|
content = message['text']
|
|
toSendMessage['text'] = content
|
|
send(urlSendMessage, toSendMessage, "reply text: " + content)
|
|
elif "sticker" in message:
|
|
content = message['sticker']
|
|
toSendMessage['sticker'] = content
|
|
send(urlSendSticker, toSendMessage, "reply sticker: " + content)
|
|
else:
|
|
print(message)
|
|
|
|
|
|
def solveSticker(message):
|
|
fileid = message['sticker']['file_id']
|
|
if fileid in replyMsgArray:
|
|
reply = replyMsgArray[fileid]
|
|
messageCount = len(reply)
|
|
messageContent = reply[rand(0, messageCount-1)]
|
|
messageChatID = message['chat']['id']
|
|
messageMessageID = message['message_id']
|
|
sendMessage(messageChatID, messageMessageID, messageContent)
|
|
return
|
|
print('unknown sticker: ' + fileid)
|
|
|
|
|
|
def solveText(message):
|
|
global replyMsgArray
|
|
text = message['text']
|
|
if '/reload_dictionary_config_file' == text:
|
|
replyMsgArray = json.load(open('dictionary.json'))
|
|
print('dictionary reload.')
|
|
|
|
|
|
def signal_handler(signal, frame):
|
|
print('Keyboard interrupt.')
|
|
os._exit(0)
|
|
|
|
|
|
def pull(pullValue):
|
|
ss = requests.Session()
|
|
ret = ss.post(urlGetUpdate, json=pullValue)
|
|
return json.loads(ret.text)
|
|
|
|
|
|
def solveRet(jsonstr):
|
|
nextid = 0
|
|
if False is jsonstr['ok']:
|
|
return nextid, False
|
|
for updateResult in jsonstr['result']:
|
|
nextid = updateResult['update_id'] + 1
|
|
message = updateResult['message']
|
|
if 'sticker' in message:
|
|
solveSticker(message)
|
|
if 'text' in message:
|
|
solveText(message)
|
|
return nextid, True
|
|
|
|
|
|
def main():
|
|
pullValue = value
|
|
while True:
|
|
retjson = pull(pullValue)
|
|
nextid, status = solveRet(retjson)
|
|
if status:
|
|
pullValue['offset'] = nextid
|
|
else:
|
|
pullValue = value
|
|
|
|
|
|
if '__main__' == __name__:
|
|
signal.signal(signal.SIGINT, signal_handler)
|
|
while True:
|
|
replyMsgArray = json.load(open('dictionary.json'))
|
|
try:
|
|
main()
|
|
except:
|
|
traceback.print_stack()
|
|
traceback.print_exc()
|
|
print("============ restart ============")
|
|
finally:
|
|
dumpReplyMsgArray()
|