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

#!/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()