main.py 6.6 KB

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