代理网站平台/做销售最挣钱的10个行业

代理网站平台,做销售最挣钱的10个行业,广州市疫情死了有多少人,网站代码加密了怎么做7.5. 配图生成 目的:由于小红书发布文章要求图文格式,因此在生成文案的基础上,我们还需要生成图文搭配文案进行发布。 原实现思路: 起初我打算使用deepseek的文生图模型Janus进行本地部署生成,参考博客:De…
7.5. 配图生成
  • 目的:由于小红书发布文章要求图文格式,因此在生成文案的基础上,我们还需要生成图文搭配文案进行发布。

  • 原实现思路:

    • 起初我打算使用deepseek的文生图模型Janus进行本地部署生成,参考博客:Deepseek发布的Janus-Pro-1B初体验但后来尝试使用后发现Janus现阶段对于这类特定任务的生成图还不太能够胜任。以下是我尝试使用文案让Janus生成的图片:
    • 文案图
  • 现实现思路:

    • 当下普遍的方案是使用文案生成一段相关的html代码,再使用python中的自动化库来进行相应部分的截图,最后将截图与文案进行组合,形成图文格式。
  • 代码实现:

    • html生成:

      '''
      Author: yeffky
      Date: 2025-02-14 08:43:28
      LastEditTime: 2025-02-15 19:28:28
      '''
      import requests
      import json
      import os
      from datetime import datetime def build_prompt(drafts):prompt = "根据下面的小红书文案,帮我生成一个html页面,包含小红书的封面(需要一个卡片状的封面,上面只需文案内容即可,需要吸引眼球),以及下方几个要点内容,要点内容和封面我希望制作成卡片形式,并且每一部分的div请为我附上属性id,id为'card1', 'card2', ...。要求符合小红书平台的图文要求规则以及平替风格,还要符合小红书平台的用户审美。回复只要给出代码即可,请不要添加多余表达" return f"""{prompt} \n\n小红书文案:\n\n{drafts}"""def get_deepseek_response(prompt, api_key):url = "https://api.deepseek.com/chat/completions"headers = {"Authorization": f"Bearer {api_key}",'Content-Type': 'application/json','Accept': 'application/json',}payload = json.dumps({"messages": [{"content": prompt,"role": "user"}],"model": "deepseek-reasoner","frequency_penalty": 0,"max_tokens": 2048,"presence_penalty": 0,"response_format": {"type": "text"},"stop": None,"stream": False,"stream_options": None,"temperature": 1,"top_p": 1,"tools": None,"tool_choice": "none","logprobs": False,"top_logprobs": None})response = Nonewhile not response:try:print("发送请求")response = requests.post(url, data=payload, headers=headers, timeout=200)response.raise_for_status()if not response.json():response = Noneexcept requests.exceptions.RequestException as e:print(f"请求失败:{str(e)},开始重试...")response = Nonereturn response.json()['choices'][0]['message']['content']def generate_html():api_key = os.getenv("DEEPSEEK_API_KEY")today = datetime.now().strftime("%Y-%m-%d")file_path = "./xiaohongshu_drafts/小红书_推广文案_千战系列" + today +".txt"drafts = open(file_path, "r", encoding="utf-8").read()prompt = build_prompt(drafts=drafts)response = get_deepseek_response(prompt, api_key)print(response)with open('./pic_generate/pic.html', 'w', encoding='utf-8') as f:f.write(response)
      
    • 截图:

      '''
      Author: yeffky
      Date: 2025-02-14 09:41:09
      LastEditTime: 2025-02-15 10:44:51
      '''
      from playwright.sync_api import sync_playwright
      import time
      import redef generate_pic(url):# 启动浏览器player = sync_playwright().start()  # 初始化Playwright并启动chrome_driver = player.chromium  # 获取Chromium浏览器实例browser = chrome_driver.launch(headless=False)  # 启动浏览器,headless=False表示以非无头模式启动,即显示浏览器窗口context = browser.new_context()  # 创建一个新的浏览器上下文(类似于一个新的浏览器窗口)page = context.new_page()  # 在该上下文中创建一个新的页面(标签页)# 访问页面card_cnt = 0with(open('./pic_generate/pic.html', 'r', encoding='utf-8')) as f:page_content = f.read()card_cnt = len(re.findall(r'<div class="card" id="card\d+">', page_content))print(card_cnt)page.goto(url)  # 导航到指定的URL#  截取相关卡片的截图for i in range(1, card_cnt + 1):card_pic = page.query_selector(f"id=card{i}")  # 使用CSS选择器查找页面中的搜索按钮元素card_pic.screenshot(path=f"./pictures/card{i}.png")  # 对搜索按钮元素进行截图并保存为b.png# 停止访问context.close()  # 关闭浏览器上下文browser.close()  # 关闭浏览器player.stop()  # 停止Playwrightif __name__ == '__main__':url = 'D:/Project/UUCrawl/Code/pic_generate/pic.html'generate_pic(url)
      
7.6. 自动化发布
  • 目的:将生成的图片和文案自动发布到小红书
  • 实现思路:
    • 1.使用python中的selenium库,模拟页面操作,登陆后需要将cookie保存下来,下次使用时直接读取cookie,避免重复登陆。同时保存一份token,每次调用登录时检查token是否过期,如未过期则无需登录操作。
    • 2.登录后,模拟页面操作前往发布页面,使用send_keys()方法输入标题和正文,使用click()方法点击发布按钮。
    • 参考开源项目:xhs_ai_publisher
  • 代码实现:
'''
Author: yeffky
Date: 2025-02-15 20:28:32
LastEditTime: 2025-02-17 14:08:45
'''
import sys
sys.path.append("./")
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from utils import line_process
import time
import json
import osclass XiaohongshuClient:def __init__(self):self.driver = webdriver.Chrome()self.wait = WebDriverWait(self.driver, 10)# 获取当前执行文件所在目录current_dir = os.path.dirname(os.path.abspath(__file__))self.token_file = os.path.join(current_dir, "xiaohongshu_token.json")self.cookies_file = os.path.join(current_dir, "xiaohongshu_cookies.json")self.token = self._load_token()self._load_cookies()def _load_token(self):"""从文件加载token"""if os.path.exists(self.token_file):try:with open(self.token_file, 'r') as f:token_data = json.load(f)# 检查token是否过期if token_data.get('expire_time', 0) > time.time():return token_data.get('token')except:passreturn Nonedef _save_token(self, token):"""保存token到文件"""token_data = {'token': token,# token有效期设为30天'expire_time': time.time() + 30 * 24 * 3600}with open(self.token_file, 'w') as f:json.dump(token_data, f)def _load_cookies(self):"""从文件加载cookies"""if os.path.exists(self.cookies_file):try:with open(self.cookies_file, 'r') as f:cookies = json.load(f)self.driver.get("https://creator.xiaohongshu.com")for cookie in cookies:self.driver.add_cookie(cookie)except:passdef _save_cookies(self):"""保存cookies到文件"""cookies = self.driver.get_cookies()with open(self.cookies_file, 'w') as f:json.dump(cookies, f)def login(self, phone, country_code="+86"):"""登录小红书"""# 如果token有效则直接返回if self.token:return# 尝试加载cookies进行登录self.driver.get("https://creator.xiaohongshu.com/login")self._load_cookies()self.driver.refresh()time.sleep(3)# 检查是否已经登录if self.driver.current_url != "https://creator.xiaohongshu.com/login":print("使用cookies登录成功")self.token = self._load_token()self._save_cookies()time.sleep(2)returnelse:# 清理无效的cookiesself.driver.delete_all_cookies()print("无效的cookies,已清理")# 如果cookies登录失败,则进行手动登录self.driver.get("https://creator.xiaohongshu.com/login")# 等待登录页面加载完成time.sleep(5)# 点击国家区号输入框country_input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[placeholder='请选择选项']")))country_input.click()time.sleep(5)# 等待区号列表出现并点击+886# 等待区号列表出现并点击+86try:self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/div[2]/div[1]/div[2]/div/div/div/div/div/div[2]/div[1]/div[1]/div/div/div[1]/input").click()time.sleep(3)self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/div[2]/div[1]/div[2]/div/div/div/div/div/div[2]/div[1]/div[1]/div/div/div[1]/input").send_keys(country_code)time.sleep(3)# self.driver.find_element(By.XPATH, "/html/body/div[6]/div/div").click()# china_option = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'css-cqcgee')]//div[contains(text(), '+86')]")))time.sleep(5)except Exception as e:print("无法找到国家区号选项")print(e)# 定位手机号输入框phone_input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[placeholder='手机号']")))phone_input.clear()phone_input.send_keys(phone)# 点击发送验证码按钮try:send_code_btn = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".css-uyobdj")))send_code_btn.click()except:# 尝试其他可能的选择器try:send_code_btn = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".css-1vfl29"))) send_code_btn.click()except:try:send_code_btn = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'发送验证码')]")))send_code_btn.click()except:print("无法找到发送验证码按钮")# 输入验证码verification_code = input("请输入验证码: ")code_input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[placeholder='验证码']")))code_input.clear()code_input.send_keys(verification_code)# 点击登录按钮login_button = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".beer-login-btn")))login_button.click()# 等待登录成功,获取tokentime.sleep(3)# 保存cookiesself._save_cookies()# 关闭浏览器# self.driver.quit()# print(f"获取到的token: {token}")# if token:#     self._save_token(token)#     self.token = token# else:#     print("未能获取到token")def post_article(self, title, content, images=None):"""发布文章Args:title: 文章标题content: 文章内容images: 图片路径列表"""# 如果token失效则重新登录# 设置token# self.driver.execute_script(f'localStorage.setItem("token", "{self.token}")')time.sleep(3)print("点击发布按钮")# 点击发布按钮publish_btn = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn.el-tooltip__trigger.el-tooltip__trigger")))publish_btn.click()# 如果是发布视频,则不操作这一步# 切换到上传图文time.sleep(3)tabs = self.driver.find_elements(By.CSS_SELECTOR, ".creator-tab")if len(tabs) > 1:tabs[1].click()time.sleep(3)# # 输入标题和内容# title_input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".title-input")))# content_input = self.driver.find_element(By.CSS_SELECTOR, ".content-input")# title_input.send_keys(title)# content_input.send_keys(content)# 上传图片if images:upload_input = self.driver.find_element(By.CSS_SELECTOR,'input[type="file"]')# 将所有图片路径用\n连接成一个字符串一次性上传upload_input.send_keys('\n'.join(images))time.sleep(1)time.sleep(3)JS_ADD_TEXT_TO_INPUT = """var elm = arguments[0], txt = arguments[1];elm.value += txt;elm.dispatchEvent(new Event('change'));"""title_input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".d-text")))self.driver.execute_script(JS_ADD_TEXT_TO_INPUT, title_input, title)# title_input.send_keys(title)# Start of Selection# Start of Selectionprint(content)JS_ADD_TEXT_TO_P = """var elm = arguments[0], txt = arguments[1];elm.textContent = txt;"""content_input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".ql-editor")))p_element = content_input.find_element(By.CSS_SELECTOR, "p")print(p_element)self.driver.execute_script(JS_ADD_TEXT_TO_P, p_element, content)# content_input.send_keys(123)# 发布time.sleep(600)submit_btn = self.driver.find_element(By.CSS_SELECTOR, ".el-button.publishBtn")submit_btn.click()def close(self):"""关闭浏览器"""self.driver.quit()def post_article():poster = XiaohongshuClient()phone = open('./docs/phone.txt').read()poster.login(phone)print("登录成功")print("开始发布文章")print(os.getcwd())title = open('./xiaohongshu_drafts/小红书_推广文案_千战系列2025-02-15.txt', 'r', encoding='utf-8').readline()article = line_process.get_article('./xiaohongshu_drafts/小红书_推广文案_千战系列2025-02-15.txt')print(article)images = os.listdir('./pictures')images = map(lambda x: os.path.join(r"D:\Project\UUCrawl\Code\pictures", x), images)poster.post_article(title, article, images)poster.close()
7.7. 主程序
from crawler import ip_crawler, data_crawler
from analysis import data_analysis
from pic_generate import pic_generate, html_generate
from post import xiaohongshu_post
import file_handlerif __name__ == '__main__':url = 'D:/Project/UUCrawl/Code/pic_generate/pic.html'# 获取IPip = ip_crawler.crawl_ip()# 获取数据data = data_crawler.crawl_data()# 数据分析data_analysis.analysis_data()file_handler.start_observer()# 生成htmlhtml_generate.generate_html()# 生成图片pic_generate.generate_pic(url)# 发布小红书xiaohongshu_post.post_article()

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

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

相关文章

Redis_基础

Redis 命令启动、配置密码 Redis是绿色软件&#xff0c;所以直接解压就能使用 配置文件为&#xff1a;redis.windows.conf 启动redis 服务&#xff1a; redis-server.exe redis.windows.conf启动客户端&#xff1a; redis-cli.exe默认没有给Redis配置密码&#xff0c;所以在…

网络通信基础:端口、协议和七层模型详解,网络安全零基础入门到精通实战教程!

一、端口和协议的概念 1.在网络技术中&#xff0c;端口(Port) 大致有两种意思&#xff1a; 一是物理意义上的端口&#xff0c;比如&#xff0c;ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口&#xff0c;如RJ-45端口、SC端口等等。 二是逻辑意义上的端口&…

Bug:Goland debug失效详细解决步骤【合集】

Bug&#xff1a;Goland debug失效详细解决步骤【合集】 今天用Goland开发时&#xff0c;打断点&#xff0c;以debug方式运行&#xff0c;发现程序并没有断住&#xff0c;程序跳过了断点&#xff0c;直接运行结束。网上搜寻了大量文章&#xff0c;最后得以解决&#xff0c;特此在…

pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网

首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话&#xff0c;那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm&#xff1a;适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…

WordPress Ai插件:支持提示词生成文章和chat智能对话

源码介绍 适用于 WordPress 的 AI 助手开源免费插件展开介绍&#xff0c;包含插件功能、使用说明、注意事项等内容&#xff0c;为 WordPress 用户提供了一个集成多种 AI 模型的工具选择。 插件概述&#xff1a;插件名称为小半 WordPress AI 助手&#xff0c;支持多种 AI 模型&…

Spring Boot02(数据库、Redis)---java八股

数据库相关 Mybatis的优缺点 优点&#xff1a; 基于 SQL 语句编程&#xff0c;相当灵活&#xff0c;不会对应用程序或者数据库的现有设计造成任何影响&#xff0c;SQL 写在 XML 里&#xff0c;解除 sql 与程序代码的耦合&#xff0c;便于统一管理&#xff1b;提供 XML 标签&am…

【LeetCode】LCR 139. 训练计划 I

题目 教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性&#xff0c;需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。 示例 1&#xff1a; 输入&#xff1a;actions [1,2,3,4,5] 输出&#…

波导阵列天线 学习笔记9 使用紧凑高效率馈网的宽带圆极化阵列天线

摘要&#xff1a; 一种宽带圆极化波导阵列天线在本文中提出。所提出的阵列天线包括四个反向对称的(antipodally)脊单元和一个有着插入阶梯腔体的两个正交膜片的紧凑型馈网。两个器件都是宽带的并且它们能独立地或者一起工作。所提出的拓扑给出了一种为大规模阵列的基础的2x2波导…

Mybatis MyBatis框架的缓存 一级缓存

1. 缓存的概念 缓存的概念 在内存中临时存储数据&#xff0c;速度快&#xff0c;可以减少数据库的访问次数。经常需要查询&#xff0c;不经常修改的数据&#xff0c;不是特别重要的数据都适合于存储到缓存中。 2.Mybatis缓存 mybatis包含了一个非常强大的查询缓存特性&#…

【EndNote】WPS 导入EndNote 21

写在前面&#xff1a;有没有人有激活码&#xff0c;跪求&#xff01; EndNote&#xff0c;在文献管理和文献引用方面很好用。写文章的时候&#xff0c;使用EndNote引入需要的文献会很方便。我目前用的WPS&#xff0c;想把EndNote的CWYW&#xff08;Cite While You Write&#…

RT-Thread+STM32L475VET6实现红外遥控实验

文章目录 前言一、板载资源介绍二、具体步骤1. 确定红外接收头引脚编号2. 下载infrared软件包3. 配置infrared软件包4. 打开STM32CubeMX进行相关配置4.1 使用外部高速时钟&#xff0c;并修改时钟树4.2 打开定时器16(定时器根据自己需求调整)4.3 打开串口4.4 生成工程 5. 打开HW…

【HarmonyOS Next】鸿蒙应用进程和线程详解

【HarmonyOS Next】鸿蒙应用进程和线程详解 一、前言 进程的定义&#xff1a; 进程是系统进行资源分配的基本单位&#xff0c;是操作系统结构的基础。 在鸿蒙系统中&#xff0c;一个应用下会有三类进程&#xff1a; (1) 主进程&#xff0c; (2) ExtensionAbility进程&#xff…

Ubuntu USB耳机找不到设备解决

​ 一. 确定硬件连接 lsusb -t 插拔USB耳机&#xff0c;确定是否有USB识别到 二. 查看输出设备 sudo apt-get install pavucontrol pavucontrol 点击想要使用的输出设备后面的绿色选项 三. 输出设备没有USB耳机时调试 3.1 确认ALSA是否识别设备 列出ALSA播放设备&#…

云计算架构学习之Ansible-playbook实战、Ansible-流程控制、Ansible-字典循环-roles角色

一、Ansible-playbook实战 1.Ansible-playbook安装软件 bash #编写yml [rootansible ansible]# cat wget.yml - hosts: backup tasks: - name: Install wget yum: name: wget state: present #检查playbook的语法 [rootansible ansible]…

用python进行二分法查找(python实例三十)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.代码示例 4.运行结果 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&#xff0c;相比其他语言经常使用英文关键…

Qt学习(五)自定义对话框,多窗口开发---添加设计师类, MDI多窗口开发

一 对话框 实现功能&#xff1a;打开文件&#xff0c;选择目录&#xff0c;保存文件&#xff0c;选择颜色&#xff0c;选择字体&#xff0c;输入信息&#xff0c; 消息提示框 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE na…

Linux部署DeepSeek r1 模型训练

之前写过一篇windows下部署deepseekR1的文章&#xff0c;有小伙伴反馈提供一篇linux下部署DeepSeek r1 模型训练教程&#xff0c;在 Linux 环境下&#xff0c;我找了足够的相关资料&#xff0c;花费了一些时间&#xff0c;我成功部署了 DeepSeek R1 模型训练任务&#xff0c;结…

嵌入式经常用到串口,如何判断串口数据接收完成?

说起通信&#xff0c;首先想到的肯定是串口&#xff0c;日常中232和485的使用比比皆是&#xff0c;数据的发送、接收是串口通信最基础的内容。这篇文章主要讨论串口接收数据的断帧操作。 空闲中断断帧 一些mcu&#xff08;如&#xff1a;stm32f103&#xff09;在出厂时就已经在…

解锁机器学习核心算法 | 随机森林算法:机器学习的超强武器

一、引言 在机器学习的广阔领域中&#xff0c;算法的选择犹如为一场冒险挑选趁手的武器&#xff0c;至关重要。面对海量的数据和复杂的任务&#xff0c;合适的算法能够化繁为简&#xff0c;精准地挖掘出数据背后隐藏的模式与价值。机器学习领域有十大核心算法&#xff0c;而随…

Shapr3D在ipad上无法识别鼠标点击问题

此问题我去过长沙Apple官方直营店咨询过此问题&#xff0c;官方直营店也不知道解决方案&#xff0c;遂在此提醒长沙Apple官方线下直营店的所有店员。 问题描述 1.不知道为什么在买了Magic Keyboard后还是无法识别单击触控板&#xff0c;遂为了解决这个问题我特意从江西跑到长沙…