[pig框架实战] 手撕视频管理发布平台[08] - 自动化发布视频到微信视频号上

自动化发布视频到视频号上

前端代码实现

在上一节,我们已经写好了发布按钮的界面,现在只需要编写处理函数FabuShipinhao即可,具体逻辑如下所示。

注意事项

  • 请求的超时时间长一些,保证视频发布完成,这里设置了两分钟timeout: 2 * 60 * 1000
  • 参数检测,前端能拿到视频的各种属性,可以先校验一下,减少不必要的服务器请求
    图例一

    FabuShipinhao(row) {
      console.log(row);
      // 参数检测
      if (row.myFlagShipinhao) {
        this.$notify.warning("视频已经发布过了");
        return
      }
      if (row.myTitleCn.length == 0) {
        this.$notify.warning("视频标题不能为空");
        return
      }
      if (row.myTagsCn.length == 0) {
        this.$notify.warning("视频标签不能为空");
        return
      }
      
      return request({
        url: '/myvideos/myvideos/FabuShipinhao',
        method: 'post',
        params: {jId: row.jid},
        timeout: 2 * 60 * 1000
      })
      .then((data) => {
        console.log(data)
        if (data.data.data) {
          this.$notify.success("修改成功");
          // 重新获取视频数据的各种属性
          this.getDataList();
        } else {
          this.$notify.warning("失败了");
        }
      })
      .catch(() => {
        this.$notify.warn("异常");
      });
    },

后台代码实现

参数加密使用的是hutool的工具函数

  • json生成 String j = JSONUtil.toJsonStr(sortedMap);
  • json中Unicode字符处理j = UnicodeUtil.toUnicode(j);
  • base64加密 String encode = Base64.encode(j);

然后拼接命令行String cmd = StrUtil.format("{} {} {}", path_python, path_script, encode);
最后调用命令行Runtime.getRuntime().exec(cmd);


	@Override
	public boolean FabuShipinhao(String jId, String myTitleCn, String myTagsCn) {
		SortedMap<String, String> sortedMap = new TreeMap<String, String>();
		sortedMap.put("jId", jId);
		sortedMap.put("myTitleCn", myTitleCn);
		sortedMap.put("myTagsCn", myTagsCn);
		String j = JSONUtil.toJsonStr(sortedMap);
		j = UnicodeUtil.toUnicode(j);
		System.out.println(j);

		// Base64
		String encode = Base64.encode(j);
		System.out.println(encode);

		// 执行任务
		boolean ret = false;
		String cmd = StrUtil.format("{} {} {}", path_python, path_script, encode);
		Process pro = null;
		try {
			pro = Runtime.getRuntime().exec(cmd);
			int exitVal = 0;
			if( pro.waitFor(2 * 60, TimeUnit.SECONDS) ) {
				exitVal = pro.exitValue();
				System.out.println(exitVal);

				ret = (exitVal == 0);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		return ret;
	}

自动化实现(python+selenium)

关于自动化环境的搭建,可以参考文章 [selenium][01] - 环境搭建

参数解析(服务器调用加密过程反过来,将参数解析出来即可)

  • base64解密 base64.b64decode(param_b64)
  • json解析 json.loads

class VideoParam:
    """
    从java后台传过来的视频参数
        param_j         {"jId": "7021124933367385346", "myTitleCn": "小慧君超强cos 是天使喔~~~", "myTagsCn": "#cosplay #小姐姐 #小慧君"}
                        {"jId": "7021124933367385346", "myTitleCn": "\u5c0f\u6167\u541b\u8d85\u5f3acos \u662f\u5929\u4f7f\u5594~~~", "myTagsCn": "#cosplay #\u5c0f\u59d0\u59d0 #\u5c0f\u6167\u541b"}
        param_b64       eyJqSWQiOiAiNzAyMTEyNDkzMzM2NzM4NTM0NiIsICJteVRpdGxlQ24iOiAiXHU1YzBmXHU2MTY3XHU1NDFiXHU4ZDg1XHU1ZjNhY29zIFx1NjYyZlx1NTkyOVx1NGY3Zlx1NTU5NH5+fiIsICJteVRhZ3NDbiI6ICIjY29zcGxheSAjXHU1YzBmXHU1OWQwXHU1OWQwICNcdTVjMGZcdTYxNjdcdTU0MWIifQ==
    """
    def __init__(self, param_b64):
        # base64解密
        param_j = json.loads(base64.b64decode(param_b64))
        print(param_j)

        # 解析参数
        self.param = types.SimpleNamespace(**param_j)

        self.path_root = r'J:/_ALL/CODE/gitee/constellations/pig-ui/public/_tiktok_res/'

自动化

  • 指定chrome的用户数据目录options.add_argument(r'--user-data-dir=xxx')
  • 判断视频是否上传完成driver.find_element_by_tag_name('video')
  • 判断是否发布完成driver.current_url,大多数视频得调整封面,所以这里不自动点击发表按钮
def publish_shipinhao(param):
    '''
    作用:发布微信视频号
    '''
    import selenium
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys

    #     time.sleep(10)
    options = webdriver.ChromeOptions()
    options.binary_location = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
    options.add_argument(r'--user-data-dir=G:\\_ALL\\chrome--user-data-dir\\公众号\\浏览器登录\\20000-爬虫分析')
    # didable "Chrome is being controled by an automated test software"
    options.add_argument('disable-infobars')
    driver = webdriver.Chrome(executable_path=r'J:\_ALL\CODE\venv\py386_automate\Scripts\chromedriver.exe', options=options)

    # 进入微信视频号创作者页面,并上传视频
    driver.get("https://channels.weixin.qq.com/post/create")
    time.sleep(2)
    driver.find_element_by_xpath('//input[@type="file"]').send_keys(param.get_path_video())

    # 等待视频上传完成
    # 检查一:等待video标签出现
    while True:
        time.sleep(3)
        try:
            video = driver.find_element_by_tag_name('video')
            if video:
                break
        except Exception as e:
            print("视频还在上传中···")

    print("视频已上传完成!")

    # 输入视频描述
    driver.find_element_by_xpath('//*[@data-placeholder="添加描述"]').send_keys(param.get_title())

    # 添加位置
    driver.find_element_by_xpath('//*[@class="position-display-wrap"]').click()
    time.sleep(2)
    driver.find_element_by_xpath('//*[text()="不显示位置"]').click()

    # 人工进行检查并发布
    while True:
        if driver.current_url == 'https://channels.weixin.qq.com/platform/post/list':
            print('发布完成')
            break

        print('等待发布...')
        time.sleep(3)
    # # 点击发布
    # driver.find_element_by_xpath('//*[text()="发表"]').click()

    return 0

参考资料

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
│ docs.rar │ 免责声明.txt │ 抓取档目录结构.txt │ 课程介绍及抓取说明.txt │ 课程封面图-大数据系统基础(自主模式).jpg │ 课程简介-大数据系统基础(自主模式).mp4 │ ├─1. 绪论 │ 0 什么是大数据.mp4 │ 1 大数据典型应用.mp4 │ 2 大数据的特点.mp4 │ 3 大数据技术体系.mp4 │ 4 大数据生态系统.mp4 │ 5 大数据技术挑战.mp4 │ 6 课程内容.mp4 │ ├─2.云计算 │ 0 2.1大数据和云计算关系概述.mp4 │ 1 2.2并行化理念.mp4 │ 10 2.11网络虚拟化:软件定义网络.mp4 │ 11 2.12软件定义网络实现.mp4 │ 12 2.13存储虚拟化:用户接口.mp4 │ 13 2.14存储虚拟化:分布式存储实现方式.mp4 │ 14 2.15虚拟化技术总结.mp4 │ 15 2.16OPENSTACK.mp4 │ 16 2.17云计算小结.mp4 │ 2 2.3规模经济理念.mp4 │ 3 2.4从仓库规模计算机到云.mp4 │ 4 2.5云计算商业模式概述.mp4 │ 5 2.6云计算带来的价值.mp4 │ 6 2.7云计算的分类.mp4 │ 7 2.8虚拟化技术概述.mp4 │ 8 2.9计算虚拟化.mp4 │ 9 2.10网络虚拟化:基础.mp4 │ ├─3.文件存储 │ 0 Video.mp4 │ 1 Video.mp4 │ 10 Video.mp4 │ 11 Video.mp4 │ 12 Video.mp4 │ 13 Video.mp4 │ 14 Video.mp4 │ 15 Video.mp4 │ 2 Video.mp4 │ 3 Video.mp4 │ 4 Video.mp4 │ 5 Video.mp4 │ 6 Video.mp4 │ 7 Video.mp4 │ 8 Video.mp4 │ 9 Video.mp4 │ ├─4. 处理框架 │ 0 4.1大数据的处理框架.mp4 │ 1 4.2MapReduce编程模型.mp4 │ 10 4.11Pig Latin 实现与优化.mp4 │ 11 Pig Latin 实现与优化(2).mp4 │ 12 4.13类似框架.mp4 │ 13 4.14章节总结.mp4 │ 2 MapReduce执行过程.mp4 │ 3 4.4MapReduce数据流.mp4 │ 4 4.5MapReduce性能优化与容错.mp4 │ 5 4.6Hadoop.mp4 │ 6 4.7MapReduce总结.mp4 │ 7 4.8Pig Latin.mp4 │ 8 4.9Pig Latin语法.mp4 │ 9 4.10Pig Latin 嵌套数据类型.mp4 │ ├─5.内存计算 │ 0 5.1内存计算概述.mp4 │ 1 5.2并行计算挑战.mp4 │ 10 5.11大数据并行系统.mp4 │ 11 5.12Spark编程接口.mp4 │ 12 5.13Spark编程实例——Log挖掘.mp4 │ 13 5.14Spark编程实例——WorkCount.mp4 │ 14 5.15Spark实现技术.mp4 │ 15 5.16复杂的DAG示例.mp4 │ 16 5.17RDD性能的提高.mp4 │ 17 5.18Spark应用和生态环境.mp4 │ 18 5.19Spark的局限性.mp4 │ 2 5.3并行计算的局限性.mp4 │ 3 5.4大数据处理并行系统.mp4 │ 4 5.5内存计算需求.mp4 │ 5 5.6MapReduce文件传递数据.mp4 │ 6 5.7内存计算的可行性.mp4 │ 7 5.8内存层次的延迟.mp4 │ 8 5.9内存计算实例-spark.mp4 │ 9 5.10SPARK-RDD.mp4 │ ├─6. NoSQL │ 0 NoSQL与Cassandra.mp4 │ 1 数据模型、接口、语言.mp4 │ 2 系统架构与Gossip协议.mp4 │ 3 一致性哈希与数据分区.mp4 │ 4 数据副本及一致性.mp4 │ 5 节点本地数据存储.mp4 │ └─7. 流计算 0 Video.mp4 1 Video.mp4 2 Video.mp4 3 Video.mp4 4 Video.mp4 5 Video.mp4 6 Video.mp4 7 Video.mp4 8 Video.mp4 9 Video.mp4

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值