aliyun.py 14 KB

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