欢迎光临UUpython
最大、最新、最全的Python代码收集站

喜马拉雅音频下载

uupython阅读(321)

这段代码是一个用于下载喜马拉雅音频的脚本,它首先发送一个GET请求获取特定链接上的页面内容,然后使用正则表达式从页面内容中提取音频的id和标题,再使用提取到的id获取音频的URL并下载到本地。以下是代码的完整版本:

import requests
import re

# 需要下载音乐的链接
link = 'https://www.ximalaya.com/album/68607356'
# 设置请求头,模拟浏览器访问
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}  
# 发送GET请求,获取网页的响应
response2 = requests.get(url=link, headers=headers).text  

# 使用正则表达式提取音乐的id和标题
pattern = r'"index":\d+,"trackId":(?P<id>\d+),"isPaid":false,"tag":0,"title":"(?P<title>.*?)"'
trackid = re.compile(pattern)
result = trackid.finditer(response2)

# 遍历匹配结果,获取音乐id和标题
for item in result:
    id = item.group('id')
    title = item.group('title')
    url = f'https://www.ximalaya.com/revision/play/v1/audio?id={id}&ptype=1'
    response = requests.get(url=url, headers=headers)
    data_list = response.json()
    src_url = data_list['data']['src']
    print(title, src_url)

    # 下载音乐文件
    music = requests.get(url=src_url, headers=headers).content

    # 将音乐文件保存到本地的'video'目录下
    with open('video\\' + title + '.m4a', mode='wb') as f:
        f.write(music)
        print('音频下载完成:', title)

需要注意以下几点:

  1. 代码使用正则表达式从页面内容中提取音频的id和标题,这种方法对于页面结构变化较大的情况可能会出现问题,建议考虑使用更稳定的方法,比如使用BeautifulSoup来解析页面。
  2. 代码中使用了喜马拉雅的API来获取音频的URL,这种方式比直接解析页面更稳定,但请注意喜马拉雅的API使用规则,避免滥用。
  3. 代码中使用headers模拟浏览器访问,这可以防止一些网站的反爬虫机制,但仍然需要注意尊重网站的使用规则。
  4. 代码中将音频保存在’video’目录下,如果你的工作目录中没有这个目录,需要先创建。

最后,请确保你的爬取行为是合法、合规的,并且尊重网站的使用条款。

wallhave原图下载

uupython阅读(371)

代码是一个用于从网站上下载图片的Python脚本,它从wallhaven.cc网站获取热门图片,并下载到指定的文件夹中。以下是你的代码的完整版本:

import os
import requests
from bs4 import BeautifulSoup
from tkinter import Tk, filedialog
import logging

def get_images_from_url(url):
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        lazyload_images = soup.find_all('img', class_='lazyload')
        image_urls = []
        for lazyload_image in lazyload_images:
            image_url = lazyload_image['data-src']
            image_urls.append(image_url)
        return image_urls
    return []
 
def modify_image_url(image_url, formats):
    image_name = image_url.split('/')[-1]
    for format in formats:
        modified_url = f"https://w.wallhaven.cc/full/{image_name[0:2]}/wallhaven-{image_name.split('.')[-2]}.{format}"
        yield modified_url
 
def download_images(image_urls, save_folder, page, formats):
    logging.basicConfig(filename=os.path.join(save_folder, 'log.txt'), level=logging.INFO)
    existing_images = set()
    if os.path.exists(os.path.join(save_folder, 'log.txt')):
        with open(os.path.join(save_folder, 'log.txt'), 'r') as log_file:
            for line in log_file:
                image_name = line.strip().split(':')[-1]
                existing_images.add(image_name)
    for url in image_urls:
        image_name = url.split('/')[-1]
        image_path = os.path.join(save_folder, image_name)
        if image_name in existing_images:
            print(f"图片已存在,跳过下载:{image_name}")
            continue
        if not os.path.exists(image_path):
            downloaded = False
            for modified_url in modify_image_url(url, formats):
                response = requests.get(modified_url)
                if response.status_code == 200:
                    with open(image_path, 'wb') as f:
                        f.write(response.content)
                    logging.info(f"{image_name}")
                    print(f"下载图片成功:{image_name}")
                    downloaded = True
                    break
            if not downloaded:
                print(f"所有链接下载失败:{image_name},已跳过")
    print(f"处理完第 {page} 页,即将处理下一页...")

if __name__ == "__main__":
    root = Tk()
    root.withdraw()

    save_folder = filedialog.askdirectory(title="选择存储文件夹")
    if save_folder:
        page = 1
        image_formats = ['jpg', 'png', 'gif', 'jpeg']
        while True:
            url = f"https://wallhaven.cc/toplist?page={page}"
            image_urls = get_images_from_url(url)
            if not image_urls:
                break
            download_images(image_urls, save_folder, page, image_formats)
            page += 1

多线程批量发送邮件,csv读取发送账号,支持图片附件

uupython阅读(255)

这段代码使用了多线程来并发发送邮件。需要注意的是,使用多线程发送邮件时,可能会受到邮件服务商的限制,因为有些服务商可能对邮件发送频率有一定的限制。

另外,请确保你的代码中的邮件账户和密码等敏感信息不会被不当地泄露。在实际使用时,建议采用更加安全的方式来管理敏感信息,比如使用配置文件或者环境变量。

最后,尽量遵循邮件服务商的使用规则,以避免被认定为滥用或垃圾邮件。

import smtplib
import csv
import threading
import argparse
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

def send_email(sender_email, sender_password, receiver_email):
    # 与SMTP服务器建立连接
    smtp_server = 'smtp.qq.com'
    server_port = 587
    server = smtplib.SMTP(smtp_server, server_port)
    server.starttls()

    try:
        # 登录邮箱账号
        server.login(sender_email, sender_password)
        # 构造邮件内容
        msg_root = MIMEMultipart('related')
        msg_root['Subject'] = '测试一下'
        msg_root['From'] = sender_email
        msg_root['To'] = receiver_email

        subject = '测试一下111111'
        message = '''
        <html>
          <body>
            <p><img src="cid:image1" alt="升学教育图片" style="width:300px;height:200px;"></p>
            <p>班上新来一位学生,名字叫“马騳骉”。</p>
            <p>开学点名了,班主任不知怎么念,就说 : 马叉叉到了没?</p>
            <p>语文老师有点文学素养,点名道:万马奔腾到了没?</p>
            
          </body>
        </html>
        '''
        # 添加文本内容
        html_part = MIMEText(message, 'html')
        msg_root.attach(html_part)

        # 添加图片附件
        with open('F:/data/png/pexels-max-andrey-1366630.jpg', 'rb') as image_file:
            image_part = MIMEImage(image_file.read())
            image_part.add_header('Content-Disposition', 'attachment; filename=1366630.jpg')
            image_part.add_header('Content-ID', '<image1>')
            msg_root.attach(image_part)

        # 添加附件#
        with open('F:/data/Jmeter弱网测试.pdf', 'rb') as file:
            attachment_part = MIMEApplication(file.read(), Name='弱网测试.pdf')
            attachment_part.add_header('Content-Disposition', 'attachment; filename=弱网测试.pdf')
            msg_root.attach(attachment_part)

        # 发送邮件
        server.sendmail(sender_email, receiver_email, msg_root.as_string())
        print(f"邮件发送成功: {receiver_email}")
    except smtplib.SMTPException as e:
        print(f"邮件发送失败: {receiver_email},错误信息: {str(e)}")

    # 关闭连接
    server.quit()

def send_emails(sender_email, sender_password, thread_count):
    # 读取CSV文件并获取收件人邮箱列表
    receiver_emails = []
    with open('E:/pythonProject/test/file/email.csv', 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            receiver_emails.append(row[0])

    # 创建线程列表
    threads = []

    # 创建发送邮件的函数
    def send_email_thread(receiver_email):
        send_email(sender_email, sender_password, receiver_email)

    # 创建并启动发送邮件的线程
    for receiver_email in receiver_emails:
        t = threading.Thread(target=send_email_thread, args=(receiver_email,))
        threads.append(t)
        t.start()

        # 控制最大线程数
        if len(threads) >= thread_count:
            for thread in threads:
                thread.join()
            threads = []

    # 等待剩余线程完成
    for thread in threads:
        thread.join()

def main():
    # 解析命令行参数
    parser = argparse.ArgumentParser(description='发送邮件')
    parser.add_argument('-s', '--sender-email', required=True, help='发件人邮箱')
    parser.add_argument('-p', '--sender-password', required=True, help='发件人密码')
    parser.add_argument('-t', '--thread-count', default=5, type=int, help='发送线程数')
    args = parser.parse_args()

    # 调用发送邮件函数
    send_emails(args.sender_email, args.sender_password, args.thread_count)

if __name__ == '__main__':
    main()

三国杀移动版24节气电脑壁纸下载 

uupython阅读(510)

这段代码是一个用来从网站上爬取图片资源的Python脚本,网站是与”三国杀节气皮肤”有关的。

代码首先导入了需要的模块:urllib.request用于发起网络请求,lxml.etree用于处理HTML内容。然后,代码定义了一系列函数来处理请求、响应以及数据提取和存储。

在主函数部分,代码从用户那里获取起始页码和结束页码,然后循环遍历这些页码。对于每个页面,它会创建一个请求对象,发送请求获取页面内容,然后使用XPath表达式从页面内容中提取图片的URL和名称。最后,通过urllib.request.urlretrieve函数将图片下载到指定的本地目录中。

需要注意以下几点:

  1. 该脚本没有错误处理机制。如果请求失败或者页面结构发生变化,代码可能会崩溃。
  2. 网站的爬取行为可能受到网站的使用条款限制,如果未经允许大量爬取,可能会被认为是不良行为。
  3. 代码中下载的文件名可能会导致重名,需要根据实际情况进行调整,确保文件名的唯一性。

请注意遵循合法、合规的网络爬取实践,并尊重网站的使用条款。如果您计划使用这个脚本来爬取网站,请务必获得网站所有者的允许。

下面是修改后的代码

import urllib.request
from lxml import etree
import datetime

def create_request(page):
    if page == 1:
        url = "https://www.sanguosha.cn/pc/wallpaper.html?type=1"
    else:
        url = "https://www.sanguosha.cn/pc/wallpaper.html?type=1&page=" + str(page)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/115.0.0.0 Safari/537.36"}
    request = urllib.request.Request(url=url, headers=headers)
    return request

def response_url(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode("utf-8")
    return content

def data_lod(content, current_time):
    global num
    tree = etree.HTML(content)
    https_list = tree.xpath("//ul[2]//@data-cross")
    name_list = tree.xpath("//ul[2]//@alt")
    for i in range(len(name_list)):
        base_url = https_list[i]
        name = name_list[i]
        num += 1
        data_url = "https://www.sanguosha.cn" + base_url
        file_name = f"D:/三国杀节气皮肤/{name}_{current_time}_{num}.jpg"
        urllib.request.urlretrieve(url=data_url, filename=file_name)

if __name__ == '__main__':
    num = 0
    begin_page = int(input("请输入起始页码:"))
    end_page = int(input("请输入结束页码:"))
    
    current_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    
    for page in range(begin_page, end_page + 1):
        request = create_request(page)
        content = response_url(request)
        data_lod(content, current_time)

七夕表白弹窗

uupython阅读(260)

代码创建了一个使用 tkinter 和 threading 的 Python 脚本,用于在屏幕上弹出一些带有“亲爱的嫁给我吧!”文本的窗口。每个窗口都会在屏幕上的随机位置显示。

这段代码中,定义了一个 dow 函数来创建并显示弹出窗口,然后使用 threading 模块创建了一系列线程来同时执行 dow 函数,从而实现了多个弹出窗口同时出现的效果。

不过,有一些问题需要注意:

  1. 界面更新问题tkinter 应该在主线程中使用,但在多个线程中使用了 tkinter 的部分。这可能会导致界面更新问题,可能会造成程序的不稳定性。
  2. 资源管理问题:在循环中创建大量的线程和窗口可能会占用大量的系统资源,特别是当同时创建大量窗口时,可能会导致程序崩溃或系统性能下降。
  3. Sleep 时间:在创建线程之前使用 time.sleep(0.1) 可能会导致线程之间的时间差不固定,从而影响到窗口的弹出顺序。
  4. 窗口关闭问题:由于每个窗口都是由独立线程创建的,可能会出现关闭窗口时的问题。需要确保在关闭窗口时正确处理资源释放。
import tkinter as tk
import random
import threading
import time
def dow():
    window = tk.Tk()
    width=window.winfo_screenwidth()
    height=window.winfo_screenheight()
    a=random.randrange(0,width)
    b=random.randrange(0,height)
    window.title('520快乐')
    window.geometry("200x50"+"+"+str(a)+"+"+str(b))
    tk.Label(window,
        text='亲爱的嫁给我吧!',    # 标签的文字
        bg='Red',     # 背景颜色
        font=('楷体', 15),     # 字体和字体大小
        width=15, height=2  # 标签长宽
        ).pack()    # 固定窗口位置
    window.mainloop()
  
threads = []
for i in range(100):#需要的弹框数量
    t = threading.Thread(target=dow)
    threads.append(t)
    time.sleep(0.1)
    threads[i].start()

当涉及到在 Tkinter 中创建多线程时,确保只有主线程(也就是 Tkinter 事件循环)与 GUI 元素进行交互,其他线程则执行独立于 GUI 的操作。以下是修正后的代码,解决了之前提到的问题:

import tkinter as tk
import random
import threading
import time

def show_window():
    width = root.winfo_screenwidth()
    height = root.winfo_screenheight()
    a = random.randrange(0, width)
    b = random.randrange(0, height)
    
    window = tk.Toplevel(root)
    window.title('520快乐')
    window.geometry("200x50+" + str(a) + "+" + str(b))
    tk.Label(
        window,
        text='亲爱的嫁给我吧!',
        bg='Red',
        font=('楷体', 15),
        width=15, height=2
    ).pack()

def create_windows():
    for _ in range(100):  # 需要的弹框数量
        t = threading.Thread(target=show_window)
        threads.append(t)
        t.start()
        time.sleep(0.1)

root = tk.Tk()
threads = []

# 在主线程中创建窗口
create_windows_button = tk.Button(root, text="创建窗口", command=create_windows)
create_windows_button.pack()

root.mainloop()

模拟谷歌浏览器登录谷歌账号

uupython阅读(365)

这段代码是用Python编写的,使用了Selenium库,用于自动化进行一系列操作来访问Google搜索控制台,并执行特定的任务。下面我将对代码中的主要部分进行解析,以便理解其作用:

  1. 导入所需的模块和库:这些模块和库将在代码中使用,以便实现自动化操作。
  2. 设置登录凭据和URL:将Google账号的用户名和密码以及目标URL进行了设置。
  3. 配置Chrome浏览器选项:设置了Chromedriver的路径和一些浏览器选项,如无头模式、用户代理、下载目录等。
  4. 执行登录操作:自动打开Google账号登录页面,填充用户名和密码,模拟登录操作。
  5. 访问Google搜索控制台:自动打开Google搜索控制台页面。
  6. 填充URL并执行操作:在搜索控制台页面,找到一个特定的div元素,填充一个URL,然后模拟点击”继续”按钮。
  7. 下载验证的HTML文件:在填充URL后,找到包含下载链接的div元素,点击下载链接,以获取验证的HTML文件。
  8. 最后的操作和清理:在try块中执行了一系列操作,如果出现异常则会在except块中捕获并打印异常。无论是否发生异常,都会在finally块中关闭浏览器实例,释放资源。

总体来说,这段代码的作用是使用Selenium库自动化执行一系列操作,从登录到Google账号,到访问搜索控制台,填充URL并下载相关文件。这可以用于快速、自动地执行一些重复性的操作,以及进行一些网络爬虫的任务。需要注意的是,网站的结构和行为可能随时变化,因此代码可能需要根据实际情况进行调整和维护。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import os
from urllib.parse import urlparse

# 替换为您的Google账号和密码
USERNAME = 'xxx@gmail.com'
PASSWORD = 'xxx'
URL = 'https:/xxxx.com/'

# 请将下面的路径替换为您下载的chromedriver所在的实际路径,chromedriver得跟你系统谷歌浏览器版本对应上
chromedriver_path = r'C:\Program Files\Google\Chrome\Application\chromedriver.exe'
# 启动Chrome浏览器
chrome_options = webdriver.ChromeOptions()
# 设置无头模式,可以隐藏浏览器窗口
# chrome_options.add_argument('--headless')
# chrome_options.add_argument('--disable-gpu')
# 设置用户代{过}{滤}理字符串
chrome_options.add_argument(
    "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36")
chrome_options.add_argument('--lang=en')
# 禁用浏览器特性
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 设置文件下载目录的路径
# download_directory = r"C:\Users\X\Downloads\Telegram Desktop"
parsed_url = urlparse(URL)
domain = parsed_url.netloc
user_path = os.path.expanduser("~")
download_directory = rf"{user_path}\Downloads\{domain}"
# 设置文件下载目录
chrome_options.add_experimental_option("prefs", {
    "download.default_directory": download_directory,
    "download.prompt_for_download": False,  # 禁止下载前询问下载路径
    "download.directory_upgrade": True,  # 允许覆盖下载
    "safebrowsing.enabled": True  # 启用安全浏览
})
driver = webdriver.Chrome(executable_path=chromedriver_path, options=chrome_options)
try:
    # 登录Google账号
    driver.get("https://accounts.google.com")
    time.sleep(2)

    username_input = driver.find_element(By.ID, "identifierId")
    username_input.send_keys(USERNAME)
    username_input.send_keys(Keys.ENTER)
    time.sleep(2)

    # 使用其他等待条件,presence_of_element_located
    password_input = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.NAME, "Passwd"))
    )

    # password_input = driver.find_element(By.NAME, "Passwd")
    password_input.send_keys(PASSWORD)
    password_input.send_keys(Keys.ENTER)
    time.sleep(3)

    # 进入Google搜索控制台
    driver.get("https://search.google.com/u/0/search-console/welcome")
    time.sleep(2)

    # 等待搜索控制台页面加载完成
    # 假设搜索控制台页面的标题为"Google Search Console"
    expected_title = "Welcome to Google Search Console"
    # while driver.title != expected_title:
    #     time.sleep(1)
    WebDriverWait(driver, 6).until(EC.title_is(expected_title))

    # 定位到data-input-type为2的div
    # div_element = driver.find_element(By.CSS_SELECTOR, 'div[data-input-type="2"]')
    div_element = driver.find_element(By.XPATH, '//div[@data-input-type="2"]')
    # input_type_2_div = WebDriverWait(driver, 3).until(
    #             EC.presence_of_element_located(
    #                 (By.CSS_SELECTOR, "div[data-input-type='2']"))
    #         )
    div_element.click()
    time.sleep(1)

    # 在div元素下定位到input框并填充值
    input_element = div_element.find_element(By.XPATH, "//input[@aria-label='https://www.example.com']")
    input_element.clear()  # 清空输入框中原有的值
    input_element.send_keys(URL)
    time.sleep(1)

    # 点击"继续"按钮
    # continue_button = div_element.find_element(By.XPATH, "//span[text()='Continue']/ancestor::div[@data-input-type='2']")
    continue_button = driver.find_element(By.XPATH, "//div[@data-input-type='2']//span[text()='Continue']")

    print(continue_button.get_attribute('outerHTML'))

    continue_button.click()
    time.sleep(5)

    # 下载验证的HTML文件
    download_link = driver.find_element(By.XPATH, '//div[contains(text(), "google")][contains(text(), ".html")]')
    html = download_link.text
    # 找到 "google" 和 ".html" 的索引位置
    start_index = html.find('google')
    end_index = html.find('.html')

    # 使用切片截取子串
    result = html[start_index:end_index + 5]
    download_link.click()
    time.sleep(2)
except Exception as e:
    # 关闭浏览器
    print(e)
finally:
    driver.quit()

爬取日本新闻网站文章发表到wordpress

uupython阅读(381)

这段代码是一个Python脚本,用于从 NHK 新闻网站提取文章信息并将其发布到 WordPress 网站。下面是对代码的逐步解释:

  1. 导入所需的库和模块:

这部分导入了需要的第三方库和模块,用于HTTP请求、HTML解析、日期处理以及与WordPress进行交互。

  1. 定义NHK新闻站点和API地址:

定义了NHK新闻站点的根URL host,以及获取新闻文章的API地址 url

  1. 设置HTTP请求头:

定义HTTP请求的头部信息,模拟浏览器请求,避免被服务器识别为爬虫。

  1. 发送HTTP GET请求,获取NHK新闻文章的JSON内容:

发送GET请求,如果响应状态码为200,则解析JSON响应内容,否则打印失败信息。

  1. 设置WordPress站点相关信息:

定义WordPress站点的XML-RPC接口地址、用户名和密码。

  1. 定义NHK新闻分类相关数据:

定义了NHK新闻分类和对应的WordPress分类信息。

  1. 解析NHK新闻文章JSON内容并进行处理:

如果响应状态码为200,那么开始遍历JSON内容中的每篇文章,进行信息提取、分类创建、图片下载、日期转换等操作。

  1. 创建WordPress客户端对象:

根据WordPress站点信息和认证信息创建一个WordPress客户端对象。

  1. 获取标题、URL、图片路径等信息:

从每篇文章的JSON数据中提取标题、URL、图片路径和分类等信息。

  1. 创建分类实例:

根据从NHK提取的分类信息,创建WordPress分类实例。

  1. 检查分类是否存在:

检查特定分类是否在WordPress中已存在,如果不存在,则调用WordPress的创建分类方法。

  1. 获取正文内容:

通过文章链接获取正文内容,使用BeautifulSoup库进行HTML解析,提取正文文本。

  1. 下载图片:

使用HTTP请求从提取的图片路径下载图片,并将其上传到WordPress媒体库。

  1. 转换日期格式:

将NHK提供的日期字符串转换为WordPress所需的日期格式。

  1. 创建文章信息:

根据提取的各项信息,构建文章信息字典。

  1. 创建WordPress文章对象:

使用WordPressPost类创建文章对象,设置标题、内容、日期、分类、特色图像等信息。

  1. 发布文章:

通过WordPress的XML-RPC接口调用NewPost方法发布文章,处理异常情况。

以上是这段代码的主要逻辑。它从NHK新闻网站获取JSON格式的文章数据,然后根据提取的信息通过WordPress的XML-RPC接口发布这些文章。请注意,代码中包含了许多细节,需要确保提供的信息和路径正确,以及确保所需的库已正确安装。

import requests
 
from bs4 import BeautifulSoup
from datetime import datetime
from wordpress_xmlrpc import Client, WordPressPost, WordPressTerm
from wordpress_xmlrpc.methods.posts import NewPost
from wordpress_xmlrpc.methods.media import UploadFile
from wordpress_xmlrpc.methods.taxonomies import NewTerm, GetTerms
from wordpress_xmlrpc.exceptions import InvalidCredentialsError
 
# WordPress站点信息
host = 'https://www3.nhk.or.jp/news/'
 
url = "https://www3.nhk.or.jp/news/json16/new_001.json"
# url1 = "https://www3.nhk.or.jp/news/json16/cat04_001.json"  # 政治
# url2 = "https://www3.nhk.or.jp/news/json16/cat01_001.json"  # 社会
# url3 = "https://www3.nhk.or.jp/news/json16/cat06_001.json"  # 国際
# url4 = "https://www3.nhk.or.jp/news/json16/cat08_001.json"  # 天気
# url5 = "https://www3.nhk.or.jp/news/json16/cat07_001.json"  # スポーツ
# url6 = "https://www3.nhk.or.jp/news/json16/cat05_001.json"  # ビジネス
 
 
headers = {
    'user-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
}
 
 
response = requests.get(url, headers=headers)
 
if response.status_code == 200:
    json_content = response.json()
    print(json_content)
else:
    print("Failed to retrieve JSON content")
 
xmlrpc = 'xmlrpc.php'
 
username = 'admin'
password = '123456'
 
host_url_arr = ['https://abc.com/']
category_arr = {
                "1": "社会",
                "2": "暮らし",
                "3": "科学&#12539;文化",
                "4": "政治",
                "5": "ビジネス",
                "6": "国際",
                "7": "スポーツ",
                "8": "天気",
 
            }
category_slug = {
                "1": "society",
                "2": "life",
                "3": "culture",
                "4": "politics",
                "5": "business",
                "6": "international",
                "7": "pe",
                "8": "weather",
 
            }
 
if response.status_code == 200:
    json_content = response.json()
    i = 0
    for article in json_content["channel"]["item"]:
        host_url = host_url_arr[i]
        host_url = host_url + xmlrpc
        wordpress_url = host_url + "index.php/wp-json/wp/v2/posts"
        # 创建WordPress客户端对象
        client = Client(host_url, username, password)
 
        # 获取标题和URL
        title = article["title"]
        url = article["link"]
        imgPath = article['imgPath']
        cate = article['cate']  # 分类
        category_name = category_arr[cate]
 
        # 创建分类实例
        category = WordPressTerm()
        category.name = category_name  # 设置分类名称
        category.taxonomy = 'category'  # 设置分类类型
        category.slug = category_slug[cate]  # 设置分类类型
 
        # 检查'category'(分类)是否存在
        terms = client.call(GetTerms('category', {'search': category_name}))
        if terms:
            print(f"{category.name} exists.")
        else:
            # 调用创建分类方法
            category_id = client.call(NewTerm(category))
 
        # 获取正文
        new_url = host + url
        content_response = requests.get(new_url)
        content_response.encoding = 'utf-8'
        content_soup = BeautifulSoup(content_response.content, "html.parser")
        content = ""
        article_body = content_soup.find("div", {"class": "content--detail-body"})
 
        if article_body is None:
            continue
 
        for p in article_body.find_all("p"):
            content += p.text.strip() + "\n"
 
        new_img_path = host + imgPath
        # 获取图片数据
        response1 = requests.get(new_img_path)
        response2 = client.call(UploadFile({
            "name": "image.jpg",  # 文件名称
            "type": "image/jpeg",  # 文件类型
            "bits": response1.content,  # 文件数据
        }))
        thumbnail_id = ''
        # 检查响应状态码和内容
        if response2:
            thumbnail_id = response2['attachment_id']
            print(f"文件已成功上传,URL:{response2['url']}")
        else:
            print("文件上传失败。")
 
        # 获取发布日期
        pub_date = article["pubDate"]
 
        date_format = '%a, %d %b %Y %H:%M:%S %z'
 
        # 将日期字符串转换为 datetime 对象
        date_obj = datetime.strptime(pub_date, date_format)
 
        # 将 datetime 对象转换为目标格式的日期字符串
        new_date_format = '%Y-%m-%dT%H:%M:%S'
        new_date_string = date_obj.strftime(new_date_format)
 
        # 输出结果
        print(title)
        print(content)
        print(pub_date)
        print(url)
 
        # 文章信息
        post_data = {
            "title": title,
            "content": content,
            "date": new_date_string,
            "slug": article['id'],
            "post_status": "publish",  # 发布状态
            "thumbnail": thumbnail_id,  # 特色图像的媒体 ID
            "terms_names": {"category": [category_name]}  # 文章所属的分类名称数组
        }
 
        wp_post = WordPressPost()
        wp_post.title = post_data["title"]
        wp_post.content = post_data["content"]
        wp_post.date = post_data["date"]
        wp_post.slug = post_data["slug"]
        wp_post.post_status = post_data.get("post_status", "publish")
        wp_post.terms_names = post_data.get("terms_names", {})
        wp_post.thumbnail = post_data.get("thumbnail", None)
 
        # 发布文章
        try:
            post_id = client.call(NewPost(wp_post))
            i += 1
            if i > 11:
                i = 0
            print(f"文章'{wp_post.title}'发布成功,ID为{post_id}")
        except InvalidCredentialsError:
            print("WordPress用户名或密码错误")
        except Exception as e:
            print(f"发布文章'{wp_post.title}'失败,错误信息:{e}")
else:
    print("Failed to retrieve JSON content")

简单的用户登录界面和注册界面

uupython阅读(309)

这段代码使用tkinter库创建了一个简单的用户登录界面和注册界面,运行后会弹出一个图形界面,用户可以在界面中输入用户名和密码来登录或注册。

以下是代码中各部分的主要功能解释:

  1. 创建主窗口 root 并设置窗口标题、大小和位置。
  2. 创建 Canvas 组件用于显示图片,通过 ImageTk.PhotoImage 将图片转换为可在界面显示的格式。
  3. 创建标签和输入框,用于用户输入用户名和密码。
  4. 定义 usr_log_in 函数,用于验证用户输入的用户名和密码是否正确,同时支持用户注册。
  5. 定义 usr_sign_up 函数,用于弹出注册窗口,用户可以在该窗口输入用户名和密码来注册。
  6. 创建按钮,分别用于登录、注册和清空输入框。
  7. 运行主循环 root.mainloop() 以启动图形界面的事件循环。

需要注意的是,代码中的图片路径和文件路径需要根据你的实际情况进行调整,另外,代码中没有进行密码加密存储,实际应用中应该考虑加密存储用户的密码。同时,图形界面的美观性和布局可以根据需求进行进一步的调整。

import tkinter as tk
import tkinter.messagebox
import pickle
from PIL import Image, ImageTk
import urllib.request
root = tk.Tk()
root.title('欢迎进入云学习平台')
root.geometry('600x400+300+150')
canvas = tk.Canvas(root, height=400, width=600)
img = Image.open('E:p/ledo.png')
img1 = img.resize((600, 400), Image.ANTIALIAS)
img_root = ImageTk.PhotoImage(img1)
canvas.create_image(300, 200, image=img_root)
canvas.pack(side='top')
label1 = tk.Label(root, text="用户名:", bg="white", font=('宋体', 12), fg='black').place(x=300, y=150)
label2 = tk.Label(root, text="密  码:", bg="white", font=('宋体', 12), fg='black').place(x=300, y=200)
entry_name = tk.Entry(root)
entry_name.place(x=400, y=150)
entry_pwd = tk.Entry(root)
entry_pwd.place(x=400, y=200)
entry_pwd['show'] = '*'
def usr_log_in():
    name = entry_name.get()
    pwd = entry_pwd.get()
    try:
        with open('E:p\\usr_info.pickle', 'rb') as usr_file:
            usrs_info = pickle.load(usr_file)
    except FileNotFoundError:
        with open('E:p\\usr_info.pickle', 'wb')as usr_file:
            usrs_info = {'admin': 'admin'}
            pickle.dump(usrs_info, usr_file)
    if name in usrs_info:
        if pwd == usrs_info[name]:
            tk.messagebox.showinfo(title='welcome', message='欢迎您:'+name)
        else:
            tk.messagebox.showerror(message='密码错误')
    elif name == '' or pwd == '':
        tk.messagebox.showerror(message='用户名或密码为空')
    else:
        is_signup = tk.messagebox.askyesno('欢迎', '您还没有注册,是否现在注册')
        if is_signup:
            usr_sign_up()
def usr_sign_up():
    def signtowcg():
        nn = entry3.get()
        np = entry4.get()
        npf= entry5.get()
        try:
            with open('E:p\\usr_info.pickle', 'rb')as usr_file:
                exist_usr_info = pickle.load(usr_file)
        except FileNotFoundError:
            exist_usr_info = {}
        if nn in exist_usr_info:
            tk.messagebox.showerror('错误', '用户名已存在')
        elif np == '' or nn == '':
            tk.messagebox.showerror('错误', '用户名或密码为空')
        elif np != npf:
            tk.messagebox.showerror('错误', '密码前后不一致')
        else:
            exist_usr_info[nn] = np
            with open('E:p\\usr_info.pickle', 'wb')as usr_file:
                pickle.dump(exist_usr_info, usr_file)
            tk.messagebox.showinfo('欢迎', '注册成功')
            window_sign_up.destroy()
    window_sign_up=tk.Toplevel(root)
    window_sign_up.geometry('350x200+420+280')
    window_sign_up.title('注册')
    label3=tk.Label(window_sign_up,text='用户名:')
    label3.place(x=20,y=15)
    entry3 = tk.Entry(window_sign_up)
    entry3.place(x=140,y=15)
    label4 = tk.Label(window_sign_up, text='请输入密码:')
    label4.place(x=20, y=55)
    entry4 = tk.Entry(window_sign_up)
    entry4.place(x=140, y=55)
    entry4['show']='*'
    label5= tk.Label(window_sign_up, text='请再次输入密码:')
    label5.place(x=20, y=95)
    entry5=tk.Entry(window_sign_up)
    entry5.place(x=140, y=95)
    entry5['show'] = '*'
    button4 = tk.Button(window_sign_up, text='确认注册', command=signtowcg)
    button4.place(x=140, y=140)
def delete():
    entry_name.delete(0,'end')
    entry_pwd.delete(0, 'end')
button1 = tk.Button(root, text='登录', font=('宋体', 12),fg='black', command=usr_log_in).place(x=300, y=270)
button2 = tk.Button(root, text='注册', font=('宋体', 12),fg='black', command=usr_sign_up).place(x=400, y=270)
button3 = tk.Button(root, text='退出', font=('宋体', 12),fg='black', command=delete).place(x=500, y=270)
root.mainloop()

爬取虎牙视频

uupython阅读(303)

这段代码主要用于从虎牙视频网站获取视频资源并下载保存到本地。下面是代码的主要部分解释:

  1. 通过 requests.get 方法发送 GET 请求来获取虎牙视频网站的页面内容。
  2. 使用正则表达式 re.findall 来匹配页面中的视频ID。<li data-vid="(\d+)"> 正则表达式匹配带有 data-vid 属性的 li 标签,提取其中的视频ID。
  3. 遍历获取到的视频ID列表,构建视频链接。
  4. 使用 requests.get 方法发送 GET 请求来获取视频详细信息,包括标题和视频链接。
  5. 解析 JSON 数据,获取视频的标题和链接。
  6. 通过视频链接发送请求,获取视频内容,并将其保存到本地以标题命名的 .mp4 文件中。
  7. 打印视频标题和视频链接。

需要注意的是,代码中的视频链接可能会有一定的鉴权和限制,具体是否能够成功获取和下载视频内容可能需要进一步处理。另外,保存视频的路径 'video\\' + title + '.mp4' 需要根据你的实际情况进行调整。此外,该代码没有添加异常处理机制,你可能需要根据实际情况进行补充。

import requests
import re
 
url = 'https://v.huya.com/g/all?set_id=51'
 
response = requests.get(url=url)
 
video_id_list = re.findall('<li data-vid="(\d+)">', response.text)
for video_id in video_id_list:
 
    link = f'https://liveapi.huya.com/moment/getMomentContent?videoId={video_id}&uid=&_=1665144759951'
 
    response_1 = requests.get(url=link)
    title = response_1.json()['data']['moment']['title']
 
    video_url = response_1.json()['data']['moment']['videoInfo']['definitions'][0]['url']
 
    video_content = requests.get(url=video_url).content
    with open('video\\' + title + '.mp4', mode='wb') as f:
 
        f.write(video_content)
    print(title, video_url)

阿里云盘签到脚本

uupython阅读(504)

这段代码的主要功能是使用阿里云盘(Aliyun Drive)的 API 来进行自动签到,并通过 Telegram Bot 发送签到结果的消息通知。下面是代码的主要部分解释:

  1. 在代码的开头,设置了 Telegram Bot 的 API Token 和目标聊天 ID。你需要将这些值替换为你自己的 Bot Token 和聊天 ID。
  2. 定义了一个 send_message_to_telegram 函数,用于发送消息到 Telegram。
  3. 定义了一个 aliyun_drive_sign_in 函数,用于进行阿里云盘的签到操作。该函数接受一个刷新令牌(refresh token)的列表作为参数。
  4. aliyun_drive_sign_in 函数中,遍历传入的刷新令牌列表,对每个刷新令牌进行签到操作。
  5. 首先使用刷新令牌获取访问令牌(access token)。
  6. 如果成功获取到 access token,则进行签到操作,发送 POST 请求到 https://member.aliyundrive.com/v1/activity/sign_in_list
  7. 解析返回的 JSON 数据,获取签到天数 signInCount
  8. 使用签到天数向 https://member.aliyundrive.com/v1/activity/sign_in_reward?_rx-s=mobile 发送 POST 请求领取奖励。
  9. 解析返回的 JSON 数据,获取奖励名称 reward_name 和奖励描述 reward_description
  10. 构建签到成功和获得奖励的消息,然后通过 send_message_to_telegram 函数将消息发送到 Telegram。
  11. 最后,通过调用 aliyun_drive_sign_in 函数来执行多个账号的签到操作。

需要注意的是,代码中的 refresh_tokens 列表需要被替换为有效的阿里云盘账号刷新令牌。确保你已经替换了 Telegram Bot 的 API Token 和聊天 ID,以便能够成功接收签到结果的消息通知。此外,代码中没有对异常情况进行详细处理,你可能需要根据实际情况添加适当的错误处理机制。

import requests
import time
 
# Telegram Bot的API Token
telegram_api_token = "你的TG_bot token"
# Telegram目标聊天ID(可以是私人对话或群组ID)
telegram_chat_id = "你的chat_id"
 
def send_message_to_telegram(message):
   url = f"https://api.telegram.org/bot{telegram_api_token}/sendMessage"
   data = {
       "chat_id": telegram_chat_id,
       "text": message,
   }
   requests.post(url, data=data)
 
def aliyun_drive_sign_in(refresh_tokens):
   for refresh_token in refresh_tokens:
       if refresh_token != "":
           # 刷新token获取access_token
           res = requests.post("https://auth.aliyundrive.com/v2/account/token",
                               json={
                                   "grant_type": "refresh_token",
                                   "refresh_token": refresh_token
                               })
           res = res.json()
           access_token = res.get('access_token')
 
           if access_token is None:
               send_message_to_telegram("refresh_token错误,请重新填写refresh_token")
           else:
               try:
                   # 进行签到
                   res2 = requests.post("https://member.aliyundrive.com/v1/activity/sign_in_list",
                                        json={"_rx-s": "mobile"},
                                        headers={"Authorization": 'Bearer ' + access_token})
                   res2 = res2.json()
                   signInCount = res2.get('result', {}).get('signInCount', 0)
 
                   # 领取奖励
                   res3 = requests.post("https://member.aliyundrive.com/v1/activity/sign_in_reward?_rx-s=mobile",
                                        json={
                                            "signInDay": signInCount
                                        },
                                        headers={"Authorization": 'Bearer ' + access_token})
                   res3 = res3.json()
                   reward_name = res3.get("result", {}).get("name")
                   reward_description = res3.get("result", {}).get("description")
 
                   # 构建签到成功和获得奖励的信息
                   message = f"账号:{res['user_name']},签到成功,本月累计签到{signInCount}天,获得奖励:{reward_name},{reward_description}"
                   send_message_to_telegram(message)
               except:
                   send_message_to_telegram("签到或领取奖励失败")
       print("\n")
 
# 多账号refresh_token值列表
refresh_tokens = ["token1", "token2", "token3"]
aliyun_drive_sign_in(refresh_tokens)