main.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import uvicorn
  2. import fastapi
  3. from fastapi.middleware.cors import CORSMiddleware
  4. from fastapi.responses import HTMLResponse
  5. from linebot import LineBotApi, WebhookHandler
  6. from linebot.models import (
  7. MessageEvent, TextMessage, TextSendMessage, FollowEvent, TemplateSendMessage, ButtonsTemplate, URITemplateAction,
  8. )
  9. import dataset
  10. import requests
  11. import json
  12. import qrcode
  13. from PIL import Image
  14. import base64, io
  15. from random import randrange
  16. import models
  17. app = fastapi.FastAPI()
  18. app.add_middleware(
  19. CORSMiddleware,
  20. allow_origins=['*'],
  21. allow_credentials=True,
  22. allow_methods=["*"],
  23. allow_headers=["*"],
  24. )
  25. # bot config
  26. line_bot_api = LineBotApi("SJT7VPT4RMQFLcS27jQBy3FcC24gtDrkcwJWZ5Xzqesr5T78LOKudHEJzt0k3b2S7n4KPwf27J7DVz2c8NQ4plSaaQylEeB1cYrfejaE/RPG/lCIQBYe4iBTzo26s4i2PcmT89837per/lTyvhVIKAdB04t89/1O/w1cDnyilFU=")
  27. handler = WebhookHandler("411ae3ef7e766739ed2c2c27b249d010")
  28. # callback event
  29. @app.post("/callback")
  30. async def callback(request: fastapi.Request):
  31. signature = request.headers['X-Line-Signature']
  32. body = await request.body()
  33. handler.handle(body.decode('utf-8'), signature)
  34. return 'OK'
  35. # follow event
  36. @handler.add(FollowEvent)
  37. def handle_follow(event):
  38. # get user id when follow
  39. real_user_id = event.source.user_id
  40. rand_num = str(randrange(99999))
  41. # db connect
  42. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
  43. table = db['users']
  44. print(rand_num)
  45. user_id = event.source.user_id + rand_num
  46. result = table.find_one(userid=real_user_id)
  47. if result:
  48. print(real_user_id)
  49. line_bot_api.reply_message(
  50. event.reply_token,
  51. TextSendMessage(text='很高興再見到您!'))
  52. else:
  53. print("n")
  54. # create user account
  55. url = 'https://nft-api-staging.joyso.io/api/v1/accounts'
  56. headers = {'Authorization': 'Basic bmZ0OmMxOTEzOWMzYjM3YjdjZWU3ZmY3OTFiZGU3NzdjZWNl'}
  57. # setup for temp use (unique id)
  58. data = 'uid=' + user_id
  59. r = requests.post(url=url, headers=headers, data=data)
  60. # extract the account address
  61. dict_str = json.loads(r.text)
  62. user_account = dict_str['account']
  63. user_address = user_account['address']
  64. # generate qr code from user id
  65. qr = qrcode.QRCode(
  66. version=1,
  67. box_size=10,
  68. border=5)
  69. qr.add_data(user_address)
  70. qr.make(fit=True)
  71. img_qr = qr.make_image(fill='black', back_color='white')
  72. filename = "qrcode/" + real_user_id + '.png'
  73. img_save = img_qr.save(filename)
  74. # open file
  75. im = Image.open(filename)
  76. # convert
  77. imgByteArr = io.BytesIO()
  78. im.save(imgByteArr, format='PNG')
  79. # decode to ascii
  80. x = imgByteArr.getvalue()
  81. base64.b64encode(x).decode('ascii')
  82. encode = base64.b64encode(x).decode('ascii')
  83. # add to db
  84. data = dict(base64=encode)
  85. result = data['base64']
  86. # table.update(dict(userid=userid, base=result), ['userid'])
  87. # write in sql
  88. data = dict(userid=real_user_id, useraddress=user_address, base=result)
  89. table.insert(data)
  90. line_bot_api.reply_message(
  91. event.reply_token,
  92. TextSendMessage(text='歡迎加入好友'))
  93. # message handler
  94. @handler.add(MessageEvent, message=TextMessage)
  95. def message(event):
  96. if '我要發送' in event.message.text:
  97. button_template_message = ButtonsTemplate(
  98. title=' ',
  99. text='點擊並打開收藏的NFT,可以選擇想要發送的NFT給對方!',
  100. actions=[
  101. URITemplateAction(
  102. label='打開發送頁面',
  103. uri='http://ark.cards/collect.html?' + event.source.user_id),])
  104. line_bot_api.reply_message(
  105. event.reply_token,
  106. TemplateSendMessage(
  107. alt_text="Receive",
  108. template=button_template_message))
  109. elif '我要接收' in event.message.text:
  110. button_template_message = ButtonsTemplate(
  111. title=' ',
  112. text='點擊並打開接收頁面,即可分享接收地址給對方!',
  113. actions=[
  114. URITemplateAction(
  115. label='打開接收頁面',
  116. uri='http://ark.cards/qr-code.html?' + event.source.user_id),])
  117. line_bot_api.reply_message(
  118. event.reply_token,
  119. TemplateSendMessage(
  120. alt_text="Receive",
  121. template=button_template_message))
  122. elif '我的NFT收藏' in event.message.text:
  123. button_template_message = ButtonsTemplate(
  124. title=' ',
  125. text='點擊並打開收藏頁面,就可以查看所有的收藏品哦!',
  126. actions=[
  127. URITemplateAction(
  128. label='打開我的NFT收藏頁面',
  129. uri='http://ark.cards/collect.html?' + event.source.user_id),])
  130. line_bot_api.reply_message(
  131. event.reply_token,
  132. TemplateSendMessage(
  133. alt_text="Receive",
  134. template=button_template_message))
  135. else:
  136. button_template_message = ButtonsTemplate(
  137. title=' ',
  138. text='更多的服務內容,歡迎請上我們的官網!',
  139. actions=[
  140. URITemplateAction(
  141. label='ArkCard的官網',
  142. uri='http://ark.cards'),])
  143. line_bot_api.reply_message(
  144. event.reply_token,
  145. TemplateSendMessage(
  146. alt_text="Receive",
  147. template=button_template_message))
  148. # nft collection api
  149. @app.get("/collection/{userid}")
  150. def collection(userid):
  151. # db connect
  152. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
  153. xname = userid
  154. sql = 'SELECT a.* FROM nft a INNER JOIN (SELECT userid FROM users WHERE userid="'+xname+'") b ON b.userid = a.userid'
  155. result = db.query(sql)
  156. rows = {}
  157. i = 0
  158. for row in result:
  159. rows[i] = row
  160. i += 1
  161. return rows
  162. # receive handler
  163. @app.get("/receive/{userid}")
  164. def receive(userid):
  165. # db connect
  166. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
  167. table = db['users']
  168. table.find_one(userid=userid)
  169. if not table.find_one(userid=userid):
  170. return "ERROR: User Not Found"
  171. else:
  172. result = table.find_one(userid=userid)
  173. return {"userid": result['userid'], "url": "/qrcode/" + userid +".png", "useraddress": result['useraddress']}
  174. # send handler
  175. @app.post("/send")
  176. async def receive(userModel : models.TransactionNft):
  177. # db connect
  178. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
  179. table2 = db['nft']
  180. # input
  181. nftid = userModel.nftid
  182. address = userModel.address
  183. if not table2.find_one(id=nftid):
  184. print("error: nft not found")
  185. return {'msg': 'nft not found'}
  186. else:
  187. statement = 'SELECT userid FROM users WHERE useraddress ="'+address+'"'
  188. for row in db.query(statement):
  189. result = row['userid']
  190. user_obj = table2.find_one(id=nftid)
  191. user_obj['userid'] = result
  192. table2.update(dict(user_obj), ['id'])
  193. return {'msg': 'OK'}
  194. if __name__ == '__main__':
  195. uvicorn.run("main:app", host="0.0.0.0", port=8228, reload=True)