Python + GitHub Actions 实现 CSDN 自动签到与抽奖(非 selenium 版本)

文章目录

    • 【1x00】技术栈
    • 【2x00】代码实现签到与抽奖
    • 【3x00】签到结果通知
      • 【03x01】Server 酱
      • 【03x02】企业微信
      • 【03x03】钉钉
    • 【4x00】自动签到
    • 【5x00】完整代码
    • 【6x00】如何使用
      • 【06x01】方法一:直接 Fork 代码(推荐)
      • 【06x01】方法二:自己上传代码


  • 本文旨在交流 Python 编程技术,若有侵犯 CSDN 利益,请联系我删除文章(直接给我删了也行😁)。

  • 其他爬虫实战代码合集(持续更新):https://github.com/TRHX/Python3-Spider-Practice

  • 爬虫实战专栏(持续更新):https://itrhx.blog.csdn.net/article/category/9351278

>>> 如果你想直接使用,不想看废话,请直接看【6x00】如何使用部分<<<


【1x00】技术栈

  • 语言:Python
  • 功能:签到、抽奖(可选)
  • 自动签到:GitHub Actions
  • 签到结果通知:Server 酱(可选)、企业微信(可选)、钉钉(可选)

【2x00】代码实现签到与抽奖

对签到和抽奖的过程抓包分析,可以揪出以下两个链接:

  • 签到:https://me.csdn.net/api/LuckyDraw_v2/signIn
  • 抽奖:https://me.csdn.net/api/LuckyDraw_v2/goodLuck

在这里插入图片描述

两者的请求方式都是 post,且两者的 Request headers 和 Request Payload 都一样。重要参数有三个:cookieusernameuuid,cookie 参数暂时没办法解决,只能自己登陆后复制过来,username 是你的 id,可以在【个人中心】—【个人资料】—【基本信息】—【用户 ID】查看,uuid 就是 cookie 里面第一个参数 uuid_tt_dd 的值。用 Python 实现基本的签到与抽奖功能如下(此代码可直接运行,需要将 CSDN_ID 和 COOKIE 换成你的,COOKIE 可以在已经登录的任意页面 F12 获取):

import requests
import jsonCSDN_ID = ''         # 你的 CSDN ID
COOKIE = ''          # 你的 cookie
IF_LUCK_DRAW = True  # 是否开启抽奖class CSDN:def __init__(self):self.UUID = COOKIE.split(';', 1)[0].split('=', 1)[1]self.USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'self.SIGN_IN_URL = 'https://me.csdn.net/api/LuckyDraw_v2/signIn'self.LUCKY_DRAW_URL = 'https://me.csdn.net/api/LuckyDraw_v2/goodLuck'self.DRAW_TIMES = 0  # 可抽奖次数self.HEADERS = {'accept': 'application/json, text/plain, */*','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7','content-length': '243','content-type': 'application/json;charset=UTF-8','cookie': COOKIE,'origin': 'https://i.csdn.net','referer': 'https://i.csdn.net/','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-site','user-agent': self.USER_AGENT}self.DATA = {'ip': '','platform': 'pc-my','product': 'pc','user_agent': self.USER_AGENT,'username': CSDN_ID,'uuid': self.UUID}def csdn_sign_in(self):response = requests.post(url=self.SIGN_IN_URL, headers=self.HEADERS, data=self.DATA)result = json.loads(response.text)# print(result)if result['code'] == 200:if not result['data']['isSigned'] and result['data']['signed']:keep_count = result['data']['keepCount']total_count = result['data']['totalCount']total_signed_count = result['data']['totalSignedCount']# self.STAR = result['data']['star']self.DRAW_TIMES = result['data']['drawTimes']print('签到成功!你已连续签到 {} 天,累计签到 {} 天,当前已有 {} 人签到。'.format(keep_count, total_count, total_signed_count))elif result['data']['isSigned']:print('你今天已经签到过了哟!')else:print('签到失败!')elif result['code'] == 400102:print('签到失败!{} 用户不存在或者 cookie 错误!请检查 CSDN ID 或尝试重置 cookie!'.format(CSDN_ID))else:print('签到失败!')def csdn_luck_draw(self):if self.DRAW_TIMES != 0:response = requests.post(url=self.LUCKY_DRAW_URL, headers=self.HEADERS, data=self.DATA)result = json.loads(response.text)# print(result)if result['code'] == 200:if result['data']['can_draw']:prize_title = result['data']['prize_title']print('抽奖成功!恭喜你获得{}'.format(prize_title))elif not result['data']['can_draw']:print('抽奖机会已经用完了哟!')else:print('抽奖失败!')elif result['code'] == 400102:print('抽奖失败!{} 用户不存在或者 cookie 错误!请检查 CSDN ID 或尝试重置 cookie!'.format(CSDN_ID))else:print('抽奖失败!')def run():c = CSDN()c.csdn_sign_in()if IF_LUCK_DRAW:c.csdn_luck_draw()if __name__ == '__main__':run()

【3x00】签到结果通知

【03x01】Server 酱

Server 酱首页:sc.ftqq.com

什么是 Server 酱?简单来说,登录 Server 酱后,会分配给你一个 SCKEY,通过向专门的 URL 发送 get 或者 post 请求,你的微信就会收到对应的消息,对于不使用企业微信和钉钉的用户来说,这种方法是最方便的。目前有标准版和 Turbo 版,据说标准版会下线,目前还能使用,所以暂时使用的是标准版。若被弃用,我会第一时间更新。实现效果:

在这里插入图片描述


【03x02】企业微信

如果你是一个企业微信群的群主,那么可以在群名右键添加一个机器人,添加成功后会给你一个机器人的 URL 地址,向这个 URL 发送 post 请求就可以在群里看到对应的消息,支持 markdown、text、图片等多种格式,具体可以查看机器人配置说明。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


【03x03】钉钉

和企业微信类似,如果你是一个钉钉群的群主,依次右键【群设置】—【群智能助手】—【添加机器人】,选择自定义(通过webhook接入自定义访问)机器人,安全设置里面选择【加签】,添加完成后你会得到一个机器人的 Webhook URL 和一个加签的密钥,之后使用特定的算法将一些参数和 URL 组成新的 URL,再向这个 URL 发送 post 请求就可以在群里收到消息了,具体使用方法参见官方文档:https://developers.dingtalk.com/document/app/custom-robot-access

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


【4x00】自动签到

这里自动签到使用的是 GitHub Actions,这是 GitHub 提出的一项持续集成服务,它提供了一个高效易用的 CI/CD 工作流,能够帮助我们自动构建、测试和部署我们的代码,简单来说,对于我们的自动签到程序,它能够每天定时运行一遍,以达到每天签到的目的,如果有 cookie,密钥之类的参数,可以在仓库的 【Settings】—【Secrets】里面添加。定时任务和运行环境等其他参数统一在一个 .yml 文件中配置。

GitHub Actions 官方文档:https://docs.github.com/cn/actions


【5x00】完整代码

CSDN 签到抽奖主程序代码 CSDN.py

注:代码不能直接运行,这是放到 GitHub Actions 上执行的代码,使用方法见【6x00】,如果要本地运行,则需要将配置项目 1 2 3 中 os.environ["xxxxx"] 换成各自对应的值!

# ====================================
# --*-- coding: utf-8 --*--
# @Time    : 2021-05-29
# @Author  : TRHX • 鲍勃
# @Blog    : www.itrhx.com
# @CSDN    : itrhx.blog.csdn.net
# @FileName: CSDN.py
# @Software: PyCharm
# ====================================import requests
import json
import os
import time
import hmac
import hashlib
import base64
import urllib.parse# ==============  1.CSDN 个人信息 ============== #
CSDN_ID = os.environ["CSDN_ID"]            # 必填!CSDN 的 ID
COOKIE = os.environ["COOKIE"]              # 必填!已登录的 cookie# ==============  2.功能开关配置项 ============== #
# 填 on 则开启,开启的同时也需要配置3中的选项,不填或填其他则关闭
IF_LUCK_DRAW = os.environ["IF_LUCK_DRAW"]  # 选填!是否开启抽奖
IF_SEVER = os.environ["IF_SEVER"]          # 选填!是否开启 server 酱通知
IF_WECHAT = os.environ["IF_WECHAT"]        # 选填!是否开启企业微信通知
IF_DING = os.environ["IF_DING"]            # 选填!是否开启钉钉通知# ==============  3.消息通知配置项 ============== #
SEVER_SCKEY = os.environ["SEVER_SCKEY"]    # 选填!server 酱的 SCKEY
WECHAT_URL = os.environ["WECHAT_URL"]      # 选填!企业微信机器人地址
DING_URL = os.environ["DING_URL"]          # 选填!钉钉机器人地址
DING_SECRET = os.environ["DING_SECRET"]    # 选填!钉钉机器人加签 SECRET# ==============  4.准备发送的消息 ============== #
TEXT = ''
DESP = ''class CSDN:def __init__(self):self.DRAW_TIMES = 0  # 可抽奖次数self.UUID = COOKIE.split(';', 1)[0].split('=', 1)[1]self.USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'self.SIGN_IN_URL = 'https://me.csdn.net/api/LuckyDraw_v2/signIn'self.LUCKY_DRAW_URL = 'https://me.csdn.net/api/LuckyDraw_v2/goodLuck'self.HEADERS = {'accept': 'application/json, text/plain, */*','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7','content-length': '243','content-type': 'application/json;charset=UTF-8','cookie': COOKIE,'origin': 'https://i.csdn.net','referer': 'https://i.csdn.net/','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-site','user-agent': self.USER_AGENT}self.DATA = {'ip': '','platform': 'pc-my','product': 'pc','user_agent': self.USER_AGENT,'username': CSDN_ID,'uuid': self.UUID}def csdn_sign_in(self):global TEXT, DESPresponse = requests.post(url=self.SIGN_IN_URL, headers=self.HEADERS, data=self.DATA)result = json.loads(response.text)# print(result)if result['code'] == 200:if not result['data']['isSigned'] and result['data']['signed']:keep_count = result['data']['keepCount']total_count = result['data']['totalCount']total_signed_count = result['data']['totalSignedCount']# self.STAR = result['data']['star']self.DRAW_TIMES = result['data']['drawTimes']TEXT = 'CSDN 签到成功!'DESP = 'CSDN 签到成功!你已连续签到 {} 天,累计签到 {} 天,当前已有 {} 人签到。'.format(keep_count, total_count, total_signed_count)print('签到成功!你已连续签到 {} 天,累计签到 {} 天,当前已有 {} 人签到。'.format(keep_count, total_count, total_signed_count))elif result['data']['isSigned']:TEXT = 'CSDN 签到失败!'DESP = 'CSDN 签到失败!你今天已经签到过了哟!'print('你今天已经签到过了哟!')else:TEXT = 'CSDN 签到失败!'print('签到失败!')elif result['code'] == 400102:TEXT = 'CSDN 签到失败!'DESP = 'CSDN 签到失败!{} 用户不存在或者 cookie 错误!请检查 CSDN ID 或尝试重置 cookie!'.format(CSDN_ID)print('签到失败!{} 用户不存在或者 cookie 错误!请检查 CSDN ID 或尝试重置 cookie!'.format(CSDN_ID))else:TEXT = 'CSDN 签到失败!'print('签到失败!')def csdn_luck_draw(self):if self.DRAW_TIMES != 0:global TEXT, DESPresponse = requests.post(url=self.LUCKY_DRAW_URL, headers=self.HEADERS, data=self.DATA)result = json.loads(response.text)print(result)if result['code'] == 200:if result['data']['can_draw']:prize_title = result['data']['prize_title']TEXT += 'CSDN 抽奖成功!'DESP += '抽奖成功!恭喜你获得{}'.format(prize_title)print('抽奖成功!恭喜你获得{}'.format(prize_title))elif not result['data']['can_draw']:TEXT += 'CSDN 抽奖失败!'DESP += 'CSDN 抽奖失败!抽奖机会已经用完了哟!'print('抽奖机会已经用完了哟!')else:TEXT += 'CSDN 抽奖失败!'print('抽奖失败!')elif result['code'] == 400102:TEXT = 'CSDN 抽奖失败!'DESP = 'CSDN 抽奖失败!{} 用户不存在或者 cookie 错误!请检查 CSDN ID 或尝试重置 cookie!'.format(CSDN_ID)print('抽奖失败!{} 用户不存在或者 cookie 错误!请检查 CSDN ID 或尝试重置 cookie!'.format(CSDN_ID))else:TEXT += 'CSDN 抽奖失败!'print('抽奖失败!')class Notice:@staticmethoddef sever():requests.get('https://sc.ftqq.com/{}.send?text={}&desp={}'.format(SEVER_SCKEY, TEXT, DESP))@staticmethoddef wechat():data = {'msgtype': 'text','text': {'content': DESP}}headers = {'content-type': 'application/json'}requests.post(url=WECHAT_URL, headers=headers, data=json.dumps(data))@staticmethoddef ding():timestamp = str(round(time.time() * 1000))secret = DING_SECRETsecret_enc = secret.encode('utf-8')string_to_sign = '{}\n{}'.format(timestamp, secret)string_to_sign_enc = string_to_sign.encode('utf-8')hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))headers = {'Content-Type': 'application/json'}complete_url = DING_URL + '&timestamp=' + timestamp + "&sign=" + signdata = {"text": {"content": DESP},"msgtype": "text"}requests.post(url=complete_url, data=json.dumps(data), headers=headers)def run():c = CSDN()n = Notice()c.csdn_sign_in()if IF_LUCK_DRAW == 'on':c.csdn_luck_draw()if IF_SEVER == 'on':n.sever()if IF_WECHAT == 'on':n.wechat()if IF_DING == 'on':n.ding()if __name__ == '__main__':run()

GitHub Actions 工作流配置文件 csdn-sign-in.yml

# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actionsname: CSDN Sign Inon:push:branches: [ main ]pull_request:branches: [ main ]schedule:- cron: 0 16 * * *jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Python 3.9uses: actions/setup-python@v2with:python-version: 3.9- name: Install dependenciesrun: |python -m pip install --upgrade pippip install requestsif [ -f requirements.txt ]; then pip install -r requirements.txt; fi- name: CSDNrun: |python3 CSDN.py env: CSDN_ID: ${{ secrets.CSDN_ID }}COOKIE: ${{ secrets.COOKIE }}IF_LUCK_DRAW: ${{ secrets.IF_LUCK_DRAW }}IF_SEVER: ${{ secrets.IF_SEVER }}IF_WECHAT: ${{ secrets.IF_WECHAT }}IF_DING: ${{ secrets.IF_DING }}SEVER_SCKEY: ${{ secrets.SEVER_SCKEY }}WECHAT_URL: ${{ secrets.WECHAT_URL }}DING_URL: ${{ secrets.DING_URL }}DING_SECRET: ${{ secrets.DING_SECRET }}

所需环境 requirements.txt

requests

【6x00】如何使用

【06x01】方法一:直接 Fork 代码(推荐)

代码地址:https://github.com/TRHX/CSDNSignIn

点击右上角【Fork】代码到你的账户,然后点击【Settings】—【Secret】—【New repository secret】,依次填入以下 Name 以及对应的 Value:

Name是否为必填项含义Value 示例
CSDN_IDCSDN 的 IDqq_36759224
COOKIE已登录的 cookieuuid_tt_dd=10_287647…
IF_LUCK_DRAW是否开启抽奖on
IF_SEVER是否开启 server 酱通知on
IF_WECHAT是否开启企业微信通知on
IF_DING是否开启钉钉通知on
SEVER_SCKEY取决于 IF_SEVERserver 酱的 SCKEYSCU165692T…
WECHAT_URL取决于 IF_WECHAT企业微信机器人地址https://qyapi.weixin.qq.com/cgi-bin/webhook/…
DING_URL取决于 IF_DING钉钉机器人地址https://oapi.dingtalk.com/robot/send…
DING_SECRET取决于 IF_DING钉钉机器人加签 SECRETSEC1cb948ba…

举例:我需要开启抽奖和 server 酱通知,则需要填的有:

NameValue
CSDN_IDqq_36759224
COOKIEuuid_tt_dd=10_287647…
IF_LUCK_DRAWon
IF_SEVERon
SEVER_SCKEYSCU165692T…

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果你需要更改每天签到的时间,则需要更改 .github/workflows/csdn-sign-in.yml 文件里面 cron: 0 16 * * * 的值,这里使用的是 Linux crontab 定时任务命令,0 16 * * * 表示每天凌晨运行一次,注意这里使用的是 UTC 国际标准时间,与北京时间相差 8 个小时,所以 UTC 时间 16 点也就是北京时间的 24 点。


注意:

  • cookie 的值需要你登录后 F12 查看复制过来,cookie 的有效期是多久暂时不得而知,等下次失效了我再回来告诉你们有效期是多久,如果我没说,那就代表一直没失效!😁

  • 经过测试,cookie 的有效期在 45 天左右,失效后需要重新复制一个新 cookie 过来!

  • 如果你开启了自动抽奖,程序会识别你当前还有多少次抽奖次数,如果抽奖次数为0,则仍然不执行抽奖任务!


【06x01】方法二:自己上传代码

【5x00】完整代码中的 CSDN.py 以及所需环境 requirements.txt 上传到自己的 GitHub 仓库,点击仓库的 【Actions】,选择【Python application】,点击【Set up this workflow】创建工作流,之后会出来一个 python-app.yml,参考【5x00】完整代码中的 csdn-sign-in.yml,添加定时任务和参数配置,编辑完成后点击【Start commit】提交。

当然也可以直接在本地编写好配置文件 csdn-sign-in.yml 直接和源码一起提交,GitHub 会自动识别,注意路径为:.github\workflows\csdn-sign-in.yml

以上步骤完成之后,再参考步骤【06x01】,完成参数设置即可。
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark安装配置

Scala基础语法学习的差不多了&#xff0c;先把spark安装上 首先官网下载解压安装后 进入到conf目录下修改文件名 修改spark-env.sh&#xff08;配置jdk路径&#xff09; export JAVA_HOME/usr/local/java/jdk1.8.0_221修改slaves&#xff08;添加子节点名&#xff09; chun…

【转】注册Azure AD 2.0 应用程序

作者&#xff1a;陈希章 发表于 2017年3月22日 上一篇 介绍了Microsoft Graph应用程序的一些概念&#xff0c;以及目前还比较普遍的Azure AD 1.0应用程序的注册方式。但正如我多次提到的那样&#xff0c;虽然目前功能还在不断完善&#xff0c;但Azure AD 2.0会逐渐成为主流&…

Python 采集 Facebook 评论插件、留言外挂程序

实现时间&#xff1a;2021-05-30实现难度&#xff1a;★★★☆☆☆实现目标&#xff1a;采集 Facebook 评论插件、留言外挂程序的所有评论。完整代码&#xff1a;https://github.com/TRHX/Python3-Spider-Practice/tree/master/CommentPlugin/facebook-comments其他爬虫实战代码…

写第一个spark程序(wordcount)

首先启动集群与spark 其次把spark目录下的README.md上传到hdfs 进入spark下的bin目录&#xff0c;运行spark-shell ./spark-shell运行 val textFile sc.textFile("hdfs://chun1:9000/spark/README.md")val wordCounts textFile.flatMap(line>line.split("…

【中国版Office 365 应用程序注册】

中国版Office 365是由世纪互联进行运营的一个云服务&#xff0c;单纯从技术角度来看的话&#xff0c;它基本保持了与国际版的同步。但是由于两个版本本质上是完全独立的&#xff0c;其中最关键的就是账号系统是分开的&#xff0c;所以从使用角度来看&#xff0c;不管是直接用户…

Python 中如何解决 asyncio 文件描述符最大数量限制问题

文章目录问题复现问题分析事件循环 EventLoopI/O 多路复用select 的缺点解决方法1.更换事件循环选择器2.限制并发量3.修改最大文件描述符限制WindowsLinux总结WindowsLinux问题复现 Windows 平台下&#xff0c;Python 版本 3.5&#xff0c;使用异步框架 asyncio&#xff0c;有…

【转】掀起Azure AD的盖头来——深入理解Microsoft Graph应用程序和服务权限声明

引子 这是一篇计划外的文章。我们都知道要进行Microsoft Graph的开发的话&#xff0c;需要进行应用程序注册。这个在此前我已经有专门的文章写过了。但这里存在一个小的问题&#xff1a;国内版的Office 365在申请好之后&#xff0c;并没有像国际版那样&#xff0c;有一个对应的…

Python3 学习系列 丨 博客目录索引

整个博客有关 Python 学习目录索引&#xff0c;方便快捷定位查询基础学习篇 Python3 基础学习笔记 C01【变量和简单数据类型】Python3 基础学习笔记 C02【列表】Python3 基础学习笔记 C03【操作列表】Python3 基础学习笔记 C04【if 语句】Python3 基础学习笔记 C05【字典】Pyt…

【转】日邮物流:实现智慧物流,这个云上对了!

和阳光、空气、水、网络一样&#xff0c;「物流」早已成为当代企业、个人赖以生存的必要条件。2020第一季度全球物流受疫情影响面临挑战&#xff0c;业内普遍预计全球物流及供应链将重新优化布局。借此时机&#xff0c;物流业纷纷将目光投向“数字化智慧物流”方向&#xff0c;…

Python 实现十大经典排序算法

目录排序算法分类一、冒泡排序&#xff08;Bubble Sort&#xff09;1、原理2、步骤3、动画演示4、代码实现5、具体示例二、选择排序&#xff08;Selection Sort&#xff09;1、原理2、步骤3、动画演示4、代码实现5、具体示例三、插入排序&#xff08;Insertion Sort&#xff09…

【转】Microsoft Graph 桌面应用程序

桌面应用程序&#xff0c;在我这篇文章的语境中&#xff0c;我是特指在Windows桌面上面直接运行的.NET应用程序&#xff0c;包括Console Application&#xff0c;WPF Application&#xff0c;Windows Forms Application, UWP Application&#xff0c;并且限于篇幅&#xff0c;我…

【转】Microsoft Graph Web应用程序极致开发体验

前言 这篇文章最早写于2017年5月2日&#xff0c;当时的想法是从最简单的方式来写如何在一个ASP.NET MVC应用程序中集成Microsoft Graph&#xff0c;但实际上还真不是那么简单&#xff0c;至少我是不满意的&#xff0c;加上这一两周都比较忙&#xff0c;所以这一篇就一直搁置。…

Spark(idea)操作mysql进行查询和插入 (代码+理解)

首先在maven中加入配置 <!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.27</version></dependency>然后在idea配置数据库 1&#xff09; 查询 //1.查询数…

【转】在无人值守程序(服务)中调用Microsoft Graph

什么是无人值守程序&#xff08;服务&#xff09; 我在此前用了几篇文章分别介绍了在桌面应用程序&#xff08;控制台&#xff09;&#xff0c;Web应用程序&#xff08;ASP.NET MVC&#xff09;&#xff0c;以及PowerSehll脚本中如何访问Microsoft Graph&#xff0c;今天这一篇…

【转】使用PowerApps快速构建基于主题的轻业务应用 —— 入门篇

前言 在上一篇文章 基于Office 365的随需应变业务应用平台 中我提到&#xff0c;随着随需应变的业务需要&#xff0c;以及技术的发展&#xff0c;业务应用的开发的模式也有了深刻的变化。基于微软的平台&#xff0c;有服务于主干业务应用的Dynamic 365 业务应用平台&#xff0…

Spark内核源码学习(暂未学完)

1&#xff09; 回顾 1.1 Spark通用运行流程概述 在submit任务条件是需要指定executo个数&#xff0c;executor-CUP个数&#xff0c;可以提高并行度。 什么是并行&#xff0c;什么是并发&#xff1f; 并发&#xff1a;假如有多个任务task&#xff0c;并行是在一个cup中&#x…

【转】使用PowerApps快速构建基于主题的轻业务应用 —— 进阶篇

在上一篇 使用PowerApps快速构建基于主题的轻业务应用 —— 入门篇 中&#xff0c;我用了三个实际的例子演示了如何快速开始使用PowerApps构建轻业务应用&#xff0c;你可能已经发现&#xff0c;我都是使用默认生成的设置&#xff0c;没有做任何修改。当然&#xff0c;那样做出…

Spark一些组件的定义

Driver program: 运行应用程序的main函数并创建SparkContext的进程 除了RDD的最终执行所写的业务逻辑&#xff0c;剩下的都在Driver里生成&#xff0c;Driver端执行action算子才会到开始执行所创建的DAG-RDD图。 Cluster manager&#xff1a; 用于获取集群资源外部服务 Mas…

【转】D365 FO第三方集成(二)---访问认证(获取访问令牌)

D365 FO 在github上发布了第三方访问D365 FO的示例代码&#xff0c;里面包含了各种调用示例&#xff0c;代码很清晰。https://github.com/microsoft/Dynamics-AX-Integration 这篇blog简单分析一下代码中获取访问令牌的部分代码。 与获取访问令牌相关的代码有两个类ClientConfi…

【转】D365 FO第三方集成(三)---服务实现

D365 FO的Custom Service的实现比AX2012简单了很多。 AX2012服务方法要用属性SysEntryPointAttribute标记&#xff0c;添加到Services以后&#xff0c;还要发布服务并在系统管理入站端口添加操作&#xff0c;服务运行在CIL下&#xff0c;所以每次改动服务方法的代码都要增量生成…