main.py 6.2 KB

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