aliyun.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. ## -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. import random
  5. import time
  6. from collections import OrderedDict
  7. import simplejson as json
  8. from alibabacloud_imarketing20220704.client import Client
  9. from alibabacloud_imarketing20220704.models import CreateDeviceRequest, ListAdvertisingRequestApp, \
  10. ListAdvertisingRequestImp, ListAdvertisingRequestUser, ListAdvertisingRequest, GetUserFinishedAdRequest
  11. from alibabacloud_tea_openapi.models import Config
  12. from aliyunsdkafs.request.v20180112 import AuthenticateSigRequest
  13. from aliyunsdkcore.client import AcsClient
  14. from aliyunsdkcore.request import CommonRequest
  15. from aliyunsdkunimkt.request.v20181207 import PopUpQueryRequest, QueryPromotionRequest
  16. from aliyunsdkunimkt.request.v20181212 import QueryUnionPromotionRequest, GetUnionTaskStatusRequest, \
  17. RegistDeviceRequest
  18. from django.conf import settings
  19. from requests import ConnectionError
  20. from simplejson import JSONDecodeError
  21. from typing import Union
  22. from apps.web.constant import Const
  23. logger = logging.getLogger(__name__)
  24. def create_sign(map, key):
  25. # type: (dict, Union[str, None]) -> str
  26. SECRET = "1234512345123451"
  27. sign = ''
  28. # 1 TODO 校验map,并排序
  29. Odict = OrderedDict(dict(sorted(map.items())))
  30. # 2 TODO 拼接字符串
  31. sign = ''
  32. for k, v in Odict.items():
  33. sign += str(k)
  34. sign += str(v)
  35. # 3 TODO 加盐
  36. sign = SECRET + sign + SECRET
  37. ba = bytearray(sign)
  38. # 4 TODO MD5加密
  39. import hashlib
  40. sign = hashlib.md5(ba).hexdigest().upper()
  41. return sign
  42. class Aliyun(object):
  43. def __init__(self, appid, secret, region_id, product_code, endpoint):
  44. self.client = AcsClient(appid, secret)
  45. self.client.add_endpoint(region_id, product_code, endpoint)
  46. @staticmethod
  47. def create_sign(map, key):
  48. # type: (dict, Union[str, None]) -> str
  49. SECRET = "1234512345123451"
  50. sign = ''
  51. # 1 TODO 校验map,并排序
  52. Odict = OrderedDict(dict(sorted(map.items())))
  53. # 2 TODO 拼接字符串
  54. sign = ''
  55. for k, v in Odict.items():
  56. sign += str(k)
  57. sign += str(v)
  58. # 3 TODO 加盐
  59. sign = SECRET + sign + SECRET
  60. ba = bytearray(sign)
  61. # 4 TODO MD5加密
  62. import hashlib
  63. sign = hashlib.md5(ba).hexdigest().upper()
  64. return sign
  65. @staticmethod
  66. def first_Cap(string):
  67. return string[0].upper() + string[1:]
  68. class AliyunSlider(Aliyun):
  69. def __init__(self, appid = Const.ALI_SLIDER_ACCESSKEY_ID, secret = Const.ALI_SLIDER_ACCESSKEY_SECRET):
  70. super(AliyunSlider, self).__init__(
  71. appid = appid,
  72. secret = secret,
  73. region_id = 'cn-hangzhou',
  74. product_code = 'afs',
  75. endpoint = 'afs.aliyuncs.com')
  76. def check_validation_results(self, sessionId, sig, token):
  77. request = AuthenticateSigRequest.AuthenticateSigRequest()
  78. # 会话ID。必填参数,从前端获取,不可更改。
  79. request.set_SessionId(sessionId)
  80. # 签名串。必填参数,从前端获取,不可更改。
  81. request.set_Sig(sig)
  82. # 请求唯一标识。必填参数,从前端获取,不可更改。
  83. request.set_Token(token)
  84. # 场景标识。必填参数,从前端获取,不可更改。
  85. request.set_Scene('nc_message_h5')
  86. # 应用类型标识。必填参数,后端填写。
  87. request.set_AppKey('FFFF0N000000000088F1')
  88. # 客户端IP。必填参数,后端填写。
  89. request.set_RemoteIp('120.26.227.50')
  90. result = self.client.do_action_with_exception(request)
  91. # 返回code 100表示验签通过,900表示验签失败
  92. return result
  93. class AliLaXin(Aliyun):
  94. def __init__(self, appid=settings.ALIYUN_ACCESS_KEY_ID, secret=settings.ALIYUN_ACCESS_KEY_SECRET):
  95. super(AliLaXin, self).__init__(
  96. appid=appid,
  97. secret=secret,
  98. region_id='cn-hangzhou',
  99. product_code='UniMkt',
  100. endpoint='cloudcode.aliyuncs.com')
  101. def QueryUnionPromotionRequest(self, param):
  102. """
  103. :param param: {'alipayOpenId': '2088812351147125','channelId': 'test',}
  104. :return:
  105. """
  106. request = QueryUnionPromotionRequest.QueryUnionPromotionRequest()
  107. request.set_AlipayOpenId(param.get('alipayOpenId'))
  108. request.set_ChannelId(param.get('channelId') or settings.ALIPAY_LAXIN_CHANNEL_ID)
  109. sign_dict = {
  110. 'alipayOpenId': request.get_AlipayOpenId(),
  111. 'channelId': request.get_ChannelId()
  112. }
  113. sign = self.create_sign(sign_dict, None)
  114. request.set_Sign(sign)
  115. try:
  116. resp = self.client.do_action_with_exception(request)
  117. except:
  118. return {}
  119. return json.loads(resp)
  120. def GetUnionTaskStatusRequest(self, param):
  121. """
  122. :param param: {'alipayOpenId': '小明','taskId': '1623913226986034',}
  123. :return:
  124. """
  125. request = GetUnionTaskStatusRequest.GetUnionTaskStatusRequest()
  126. request.set_AlipayOpenId(param.get('alipayOpenId'))
  127. request.set_TaskId(param.get('taskId'))
  128. request.add_query_param('ChannelId', param.get('channelId', settings.ALIPAY_LAXIN_CHANNEL_ID)) # 此字段不参与签名
  129. sign_dict = {
  130. 'alipayOpenId': request.get_AlipayOpenId(),
  131. 'taskId': request.get_TaskId(),
  132. }
  133. sign = create_sign(sign_dict, None)
  134. request.set_Sign(sign)
  135. try:
  136. resp = self.client.do_action_with_exception(request)
  137. except:
  138. return {}
  139. return json.loads(resp)
  140. class AliRuHui(Aliyun):
  141. def __init__(self, appid=settings.ALIYUN_ACCESS_KEY_ID, secret=settings.ALIYUN_ACCESS_KEY_SECRET):
  142. super(AliRuHui, self).__init__(
  143. appid=appid,
  144. secret=secret,
  145. region_id='cn-hangzhou',
  146. product_code='UniMkt',
  147. endpoint='cloudcode.cn-hangzhou.aliyuncs.com')
  148. # 入会
  149. def PopUpQueryRequest(self, param):
  150. request = PopUpQueryRequest.PopUpQueryRequest()
  151. request.set_UrlId(param.get('urlId')) # url Id号码
  152. request.set_ChannelId(param.get('channelId', settings.ALIPAY_RUHUI_CHANNEL_ID)) # 渠道号
  153. request.set_AlipayOpenId(param.get('alipayOpenId')) # 阿里 openId
  154. request.set_OuterCode(param.get('outerCode')) # 设备号
  155. request.set_Extra(param.get('extra', '')) # 额外字段
  156. request.set_OptionType('1') # 渠道商自由分配 !!! 重要
  157. try:
  158. resp = self.client.do_action_with_exception(request)
  159. except:
  160. return {}
  161. return json.loads(resp)
  162. def QueryPromotionRequest(self, param):
  163. request = QueryPromotionRequest.QueryPromotionRequest()
  164. request.set_AlipayOpenId(param.get('alipayOpenId')) # 阿里 openId
  165. request.set_ChannelId(param.get('channelId', settings.ALIPAY_RUHUI_CHANNEL_ID)) # 渠道号
  166. try:
  167. resp = self.client.do_action_with_exception(request)
  168. except:
  169. return {}
  170. return json.loads(resp)
  171. def RegistDeviceRequest(self):
  172. request = RegistDeviceRequest.RegistDeviceRequest()
  173. # 固定值
  174. request.set_FirstScene('社区')
  175. request.set_SecondScene('普通社区')
  176. request.set_DeviceType('聚合支付')
  177. request.set_ChannelId('QD-VHWFTEST-434497')
  178. # 设备唯一编号
  179. request.set_OuterCode('434497')
  180. # 设置省份
  181. request.set_Province('山东省')
  182. # 设置所属城市
  183. request.set_City('济南')
  184. # 设置所属区域
  185. request.set_District('高新区')
  186. # 设置详细地址
  187. request.set_DetailAddr('中铁财智6号楼')
  188. # 设备型号
  189. request.set_DeviceModelNumber('设备型号')
  190. # 设备名称
  191. request.set_DeviceName('猛犸充电桩')
  192. # 设备点位名称
  193. request.set_LocationName('点位名称')
  194. # 楼层名称
  195. request.set_Floor('楼层')
  196. resp = self.client.do_action_with_exception(request)
  197. return resp
  198. class AliSms(Aliyun):
  199. def __init__(self, appid = 'LTAI4GEc1j8pvs4EjFrtL5K9', secret = 'KuCEo8YWRn7tjQaJsXJCcG7P4leBMr'):
  200. super(AliSms, self).__init__(
  201. appid = appid,
  202. secret = secret,
  203. region_id = 'cn-hangzhou',
  204. product_code = 'Dysmsapi',
  205. endpoint = 'dysmsapi.aliyuncs.com')
  206. def send(self, phoneNumber, templateId, msg, productName, verifyCode = False):
  207. """
  208. :param phoneNumber:
  209. :param templateId:
  210. :param msg:
  211. :param productName:
  212. :return: dict
  213. """
  214. try:
  215. request = CommonRequest()
  216. request.set_accept_format('json')
  217. request.set_method('POST')
  218. request.set_protocol_type('http') # https | http
  219. request.set_version('2017-05-25')
  220. request.set_action_name('SendSms')
  221. request.add_query_param('RegionId', 'cn-hangzhou')
  222. request.add_query_param('PhoneNumbers', phoneNumber)
  223. # request.add_query_param('SignName', productName)
  224. request.add_query_param('SignName', u'微付乐')
  225. request.add_query_param('TemplateCode', templateId)
  226. if verifyCode:
  227. request.add_query_param('TemplateParam', {'code': msg})
  228. else:
  229. request.add_query_param('TemplateParam', {'user': productName, 'detail': msg})
  230. response = self.client.do_action_with_exception(request)
  231. result = json.loads(response)
  232. if result['Code'] == 'OK':
  233. return {'result': True, 'msg': 'success'}
  234. else:
  235. return {'result': False, 'msg': result['Message']}
  236. except JSONDecodeError as e:
  237. logger.exception(e)
  238. return {'result': False, 'msg': u'短信服务器繁忙,请稍后重试'}
  239. except ConnectionError as e:
  240. logger.exception(e)
  241. return {'result': False, 'msg': u'短信服务器不可用,请稍后重试'}
  242. class AlipayYunMaV3:
  243. def __init__(self, access_key_id=None, access_key_secret=None):
  244. self.config = Config(
  245. access_key_id=access_key_id or settings.ALIYUN_ACCESS_KEY_ID,
  246. access_key_secret=access_key_secret or settings.ALIYUN_ACCESS_KEY_SECRET,
  247. region_id='cn-hangzhou',
  248. )
  249. def reg_dev(self, dic):
  250. self.config.endpoint = 'imarketing.cn-zhangjiakou.aliyuncs.com'
  251. dic.update({
  252. 'channel_id': settings.ALIPAY_CHANNEL_ID_V3,
  253. 'media_id': settings.ALIPAY_MEDIA_ID_V3,
  254. })
  255. request = CreateDeviceRequest(**dic)
  256. client = Client(self.config)
  257. response = client.create_device(request)
  258. return response
  259. def get_cpm_body(self, openId, logicalCode):
  260. cpm_imp_id = 'CPM{:}{:03d}'.format(int(time.time() * 1000), random.randint(1, 1000))
  261. self.config.endpoint = 'imarketing.aliyuncs.com'
  262. app = ListAdvertisingRequestApp(mediaid=settings.ALIPAY_MEDIA_ID_V3, sn=logicalCode)
  263. cpm_imp = ListAdvertisingRequestImp(id=cpm_imp_id, tagid=settings.ALIPAY_IMP_CPM_V3)
  264. user = ListAdvertisingRequestUser(id=openId, usertype='ALIPAY_OPEN_ID')
  265. request = ListAdvertisingRequest(app=app, imp=[cpm_imp], user=user)
  266. client = Client(self.config)
  267. response = client.list_advertising(request)
  268. return response
  269. def get_cpa_ruhui_body(self, openId, logicalCode):
  270. rh_imp_id = 'CPARH{:}{:03d}'.format(int(time.time() * 1000), random.randint(1, 1000))
  271. self.config.endpoint = 'imarketing.aliyuncs.com'
  272. app = ListAdvertisingRequestApp(mediaid=settings.ALIPAY_MEDIA_ID_V3, sn=logicalCode)
  273. rh_imp = ListAdvertisingRequestImp(id=rh_imp_id, tagid=settings.ALIPAY_IMP_CPA_RUHUI_V3)
  274. user = ListAdvertisingRequestUser(id=openId, usertype='ALIPAY_OPEN_ID')
  275. request = ListAdvertisingRequest(app=app, imp=[rh_imp], user=user, id=rh_imp_id)
  276. client = Client(self.config)
  277. response = client.list_advertising(request)
  278. return response
  279. def get_cpa_laxin_body(self, openId, logicalCode):
  280. lx_imp_id = 'CPALX{:}{:03d}'.format(int(time.time() * 1000), random.randint(1, 1000))
  281. self.config.endpoint = 'imarketing.aliyuncs.com'
  282. app = ListAdvertisingRequestApp(mediaid=settings.ALIPAY_MEDIA_ID_V3, sn=logicalCode)
  283. lx_imp = ListAdvertisingRequestImp(id=lx_imp_id, tagid=settings.ALIPAY_IMP_CPA_RUHUI_V3)
  284. user = ListAdvertisingRequestUser(id=openId, usertype='ALIPAY_OPEN_ID')
  285. request = ListAdvertisingRequest(app=app, imp=[lx_imp], user=user, id=lx_imp_id)
  286. client = Client(self.config)
  287. response = client.list_advertising(request)
  288. return response
  289. def query_task_status(self, clicklink, openId, adid, taskType='RH'):
  290. self.config.endpoint = 'imarketing.aliyuncs.com'
  291. if taskType == 'RH': # 入会
  292. tagid = settings.ALIPAY_IMP_CPA_RUHUI_V3
  293. elif taskType == 'LX': # 拉新
  294. tagid = settings.ALIPAY_IMP_CPA_LAXIN_V3
  295. elif taskType == 'CPM':
  296. tagid = settings.ALIPAY_IMP_CPM_V3
  297. else:
  298. raise TypeError('task type not in ["CPM", "RH", "LX"]')
  299. request = GetUserFinishedAdRequest(adid=adid, clicklink=clicklink, mediaid=settings.ALIPAY_MEDIA_ID_V3,
  300. tagid=tagid, uid=openId)
  301. client = Client(self.config)
  302. response = client.get_user_finished_ad(request)
  303. return response