main.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. from fastapi import FastAPI, Form, Request
  2. from fastapi.encoders import jsonable_encoder
  3. from fastapi.middleware.cors import CORSMiddleware
  4. import dataset
  5. import pandas as pd
  6. from starlette.responses import FileResponse, StreamingResponse
  7. from fastapi.responses import HTMLResponse
  8. from fastapi.staticfiles import StaticFiles
  9. import io
  10. from starlette.responses import RedirectResponse
  11. import codecs
  12. import random
  13. from starlette.status import HTTP_302_FOUND,HTTP_303_SEE_OTHER
  14. import smtplib
  15. import traceback
  16. import requests
  17. import threading
  18. import os
  19. from email.mime.text import MIMEText
  20. from email.mime.image import MIMEImage
  21. from email.mime.multipart import MIMEMultipart
  22. import boto3
  23. from botocore.exceptions import ClientError
  24. from email.mime.base import MIMEBase
  25. from email.mime.application import MIMEApplication
  26. import random
  27. import requests
  28. app = FastAPI()
  29. app.add_middleware(
  30. CORSMiddleware,
  31. allow_origins=['*'],
  32. allow_credentials=True,
  33. allow_methods=["*"],
  34. allow_headers=["*"],
  35. )
  36. coffee='0'
  37. def hhh_send_mail(email,coffee=False,lineid=None):
  38. SENDER = "Gorgeous Space <noreply@hhh.com.tw>"
  39. RECIPIENT = "jeweiliang@gmail.com"
  40. AWS_REGION = "us-east-1"
  41. CHARSET = "UTF-8"
  42. client = boto3.client('ses',region_name=AWS_REGION)
  43. # Try to send the email.
  44. try:
  45. #Provide the contents of the email.
  46. msg = MIMEMultipart()
  47. msg["Subject"] = "[幸福空間] 您的五萬元裝修折價券 "
  48. msg["From"] = "noreply@hhh.com.tw"
  49. msg["To"] = email
  50. # Set message body
  51. if coffee:
  52. body = MIMEText("感謝填寫幸福空間問卷,開啟下方完整券樣(密碼9888)至櫃台掃碼兌換。https://txp.rs/v/EvX69b4Xq9 \n\n 附件是您的五萬元裝修折價券\n", "plain")
  53. try:
  54. if lineid is not None:
  55. x = requests.get('https://cal.ptt.cx:5443/msg/'+lineid)
  56. print(x.status_code)
  57. except:
  58. traceback.print_exc()
  59. else:
  60. body = MIMEText("感謝填寫幸福空間問卷,這是您的五萬元裝修折價券\n", "plain")
  61. msg.attach(body)
  62. filename = "coupon.png" # In same directory as script
  63. with open(filename, "rb") as attachment:
  64. part = MIMEApplication(attachment.read())
  65. part.add_header("Content-Disposition",
  66. "attachment",
  67. filename=filename)
  68. msg.attach(part)
  69. response = client.send_raw_email(
  70. Source=msg["From"],
  71. Destinations=[msg["To"]],
  72. RawMessage={"Data": msg.as_string()}
  73. )
  74. print(response)
  75. # Display an error if something goes wrong.
  76. except ClientError as e:
  77. print(e.response['Error']['Message'])
  78. else:
  79. print("Email sent! Message ID:"),
  80. print(response['MessageId'])
  81. os.system('python3 /root/hhh_step_question/step_question/tests/dftest.py &')
  82. def thread_mail(umail):
  83. print('thread_mail called')
  84. # r = requests.get('http://3.220.159.187:8081/mailto/'+umail)
  85. # print(r.text)
  86. # os.chdir('/root/hhh_step_question/step_question/tests')
  87. # os.system('python3 /root/hhh_step_question/step_question/tests/dftest.py &')
  88. def get_db():
  89. # db = dataset.connect('mysql://choozmo:pAssw0rd@139.162.121.30:33306/hhh?charset=utf8mb4')
  90. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4')
  91. step_questions_table = db['step_questions']
  92. return step_questions_table
  93. def mail_to_user(umail):
  94. r = requests.get('http://3.220.159.187:8081/mailto/'+umail)
  95. print(r.text)
  96. # os.chdir('/root/hhh_step_question/step_question/tests')
  97. os.system('python3 /root/hhh_step_question/step_question/tests/dftest.py &')
  98. # umail
  99. @app.post("/step_questions/submit", response_class=RedirectResponse)
  100. async def submit(request: Request):
  101. form_data = await request.form()
  102. # form_data = request.form()
  103. email=form_data.get('q3')
  104. result = {
  105. 'sex': form_data.get('q1'),
  106. 'phone': form_data.get('q2'),
  107. 'email': email,
  108. 'building_case_name': form_data.get('q4'),
  109. 'building_case_type': form_data.get('q5'),
  110. 'decoration_style': ','.join(form_data.getlist('q6')),
  111. 'decoration_budget': ','.join(form_data.getlist('q7')),
  112. 'decoration_size': ','.join(form_data.getlist('q8')),
  113. 'src':'SMS'
  114. }
  115. print(result)
  116. get_db().insert(result)
  117. # mail_to_user(email)
  118. x = threading.Thread(target=hhh_send_mail, args=(email,))
  119. x.start()
  120. return RedirectResponse(url="/a1/index_complete_msg.html", status_code=HTTP_302_FOUND)
  121. # return result
  122. @app.post("/step_questions/line-submit", response_class=RedirectResponse)
  123. async def line_submit(request: Request):
  124. form_data = await request.form()
  125. print(form_data)
  126. # form_data = request.form()
  127. email=form_data.get('q3')
  128. result = {
  129. 'sex': form_data.get('q1'),
  130. 'phone': form_data.get('q2'),
  131. 'email': email,
  132. 'building_case_name': form_data.get('q4'),
  133. 'building_case_type': form_data.get('q5'),
  134. 'decoration_style': ','.join(form_data.getlist('q6')),
  135. 'decoration_budget': ','.join(form_data.getlist('q7')),
  136. 'decoration_size': ','.join(form_data.getlist('q8')),
  137. 'src':'LINE',
  138. 'userid': form_data.get('userid'),
  139. # 'id': form_data.get('id'),
  140. 'area': form_data.get('area'),
  141. }
  142. if result['userid']==None:
  143. result['userid']="None"
  144. print(result)
  145. get_db().insert(result)
  146. # mail_to_user(email)
  147. x = threading.Thread(target=hhh_send_mail, args=(email,True,result['userid']))
  148. x.start()
  149. return RedirectResponse(url="/a1/index_complete_line_after.html", status_code=HTTP_302_FOUND)
  150. # return result
  151. app.mount("/a1", StaticFiles(directory="static"), name="static")
  152. @app.get("/coffee/set/{item_id}")
  153. async def coffee_set(item_id: int):
  154. global coffee
  155. if item_id==0:
  156. coffee='0'
  157. else:
  158. coffee='1'
  159. return {"code":"ok" }
  160. @app.get("/coffee")
  161. async def coffee_get():
  162. global coffee
  163. # val=random.randint(5,100)
  164. # coffee='0'
  165. # if val%2==0:
  166. # coffee='1'
  167. return {'coffee':coffee}
  168. @app.get("/220")
  169. async def redirect220():
  170. # response = RedirectResponse(url='/a1/index-line.html')
  171. response = RedirectResponse(url='https://line.me/R/ti/p/@064mjcjv')
  172. response.set_cookie(key="area", value="220", domain="q.ptt.cx")
  173. return response
  174. @app.get("/242")
  175. async def redirect242():
  176. # response = RedirectResponse(url='/a1/index-line.html')
  177. response = RedirectResponse(url='https://line.me/R/ti/p/@064mjcjv')
  178. response.set_cookie(key="area", value="242", domain="q.ptt.cx")
  179. return response
  180. @app.get("/241")
  181. async def redirect241():
  182. # response = RedirectResponse(url='/a1/index-line.html')
  183. response = RedirectResponse(url='https://line.me/R/ti/p/@064mjcjv')
  184. response.set_cookie(key="area", value="241", domain="q.ptt.cx")
  185. return response
  186. @app.get("/112")
  187. async def redirect112():
  188. # response = RedirectResponse(url='/a1/index-line.html')
  189. response = RedirectResponse(url='https://line.me/R/ti/p/@064mjcjv')
  190. response.set_cookie(key="area", value="112", domain="q.ptt.cx")
  191. return response
  192. @app.get("/111")
  193. async def redirect111():
  194. # response = RedirectResponse(url='/a1/index-line.html')
  195. response = RedirectResponse(url='https://line.me/R/ti/p/@064mjcjv')
  196. response.set_cookie(key="area", value="111", domain="q.ptt.cx")
  197. return response
  198. @app.get("/a1")
  199. async def redirect():
  200. # url = app.url_path_for("/a1/index.html")
  201. response = RedirectResponse(url='/a1/index.html')
  202. return response
  203. #@app.get("/a1", response_class=HTMLResponse)
  204. #@app.get("/a1", response_class=HTMLResponse)
  205. #async def read_items():
  206. # return """
  207. # <html>
  208. # <head>
  209. # <title>Some HTML in here</title>
  210. # </head>
  211. # <body>
  212. # <h1>Look ma! HTML!</h1>
  213. # </body>
  214. # </html>
  215. # """
  216. @app.get("/step_questions")
  217. async def get_step_question(request: Request):
  218. db_data = list(get_db().find())
  219. df = pd.DataFrame(db_data, columns=db_data[0].keys())
  220. stream = io.StringIO()
  221. df.to_csv(stream, index = False)
  222. # response = StreamingResponse(data_frame.to_csv(index=False), media_type="text/csv")
  223. response = StreamingResponse(iter([stream.getvalue()]), media_type="text/csv")
  224. response.headers["Content-Disposition"] = "attachment; filename=export.csv"
  225. return response