吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2647|回复: 27
收起左侧

[Python 原创] python获取每日机票最低价格并推送到QQ群

[复制链接]
cuterror 发表于 2024-6-6 17:26
本帖最后由 cuterror 于 2024-6-11 15:49 编辑

本帖偏向于萌新向,大佬可以快速跳过
前言:
临近假期想着出去跟朋友玩一圈,提前大概两周时间买了机票,最近突然想起来她上次说的机票降价事情(提前买了临出发日期降价)
所以也打开了携程看了一眼,好家伙,去程比我买的时候便宜了200,返程便宜了50,总共便宜了250。。。

一怒之下,怒了一下想弄个查机票最低价格的工具,在52上发现了几年前大佬发的node.js的一版,按照大佬云函数的方法尝试了一遍不停报错
,看不懂node.js代码的小白我选择放弃,附上大佬的文章地址,感兴趣的小伙伴可以去尝试下
https://www.52pojie.cn//forum.php?mod=viewthread&tid=1529774&highlight=%BB%FA%C6%B1

1.借鉴大佬的代码,使用python编写

[Python] 纯文本查看 复制代码
import requests
from datetime import datetime


def get_week(date_str):
    date_obj = datetime.strptime(date_str, "%Y-%m-%d")
    return "星期" + "日一二三四五六"[date_obj.weekday()]


def get_str(date, start_address, arrival_address, price):
    year, month, day = date[:4], date[4:6], date[6:]
    date_str = f"{year}-{month}-{day}"
    return f"{date_str} {get_week(date_str)}\n    {start_address} —— {arrival_address} 机票最低价格是 {price} 元\n"


def send_message_via_qmsg(msg, qq):
    qmsg_url = 'https://qmsg.zendee.cn/send/你的qmsg_token'
    data = {'msg': msg, 'qq': qq}
    response = requests.post(qmsg_url, data=data)
    return response.json()


def fetch_ticket_prices(start_code, end_code):
    url = f"https://flights.ctrip.com/itinerary/api/12808/lowestPrice?flightWay=Oneway&dcity={start_code}&acity={end_code}&direct=true&army=false"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json().get('data', {}).get('oneWayPrice', [{}])[0]
    else:
        raise Exception(f"Failed to get data, status code: {response.status_code}")


def main_handler(start_address, arrival_address):
    txt = {
        '北京':'BJS', '上海':'SHA', '广州':'CAN', '深圳':'SZX', '成都':'CTU', '杭州':'HGH', '武汉':'WUH', '西安':'SIA', '重庆':'CKG', '青岛':'TAO', '长沙':'CSX', '南京':'NKG', '厦门':'XMN', '昆明':'KMG', '大连':'DLC', '天津':'TSN', '郑州':'CGO', '三亚':'SYX', '济南':'TNA', '福州':'FOC', '阿勒泰':'AAT', '阿克苏':'AKU', '鞍山':'AOG', '安庆':'AQG', '安顺':'AVA', '阿拉善左旗':'AXF', '中国澳门':'MFM', '阿里':'NGQ', '阿拉善右旗':'RHT', '阿尔山':'YIE', '巴中':'BZX', '百色':'AEB', '包头':'BAV', '毕节':'BFJ', '北海':'BHY', '北京(大兴国际机场)':'BJS,PKX', '北京(首都国际机场)':'BJS,PEK', '博乐':'BPL', '保山':'BSD', '白城':'DBC', '布尔津':'KJI', '白山':'NBS', '巴彦淖尔':'RLK', '昌都':'BPX', '承德':'CDE', '常德':'CGD', '长春':'CGQ', '朝阳':'CHG', '赤峰':'CIF', '长治':'CIH', '沧源':'CWJ', '常州':'CZX', '池州':'JUH', '大同':'DAT', '达州':'DAX', '稻城':'DCY', '丹东':'DDG', '迪庆':'DIG', '大理':'DLU', '敦煌':'DNH', '东营':'DOY', '大庆':'DQA', '德令哈':'HXD', '鄂尔多斯':'DSN', '额济纳旗':'EJN', '恩施':'ENH', '二连浩特':'ERL', '阜阳':'FUG', '抚远':'FYJ', '富蕴':'FYN', '果洛':'GMQ', '格尔木':'GOQ', '广元':'GYS', '固原':'GYU', '中国高雄':'KHH', '赣州':'KOW', '贵阳':'KWE', '桂林':'KWL', '红原':'AHJ', '海口':'HAK', '河池':'HCJ', '邯郸':'HDG', '黑河':'HEK', '呼和浩特':'HET', '合肥':'HFE', '淮安':'HIA', '怀化':'HJJ', '海拉尔':'HLD', '哈密':'HMI', '衡阳':'HNY', '哈尔滨':'HRB', '和田':'HTN', '花土沟':'HTT', '中国花莲':'HUN', '霍林郭勒':'HUO', '惠州':'HUZ', '汉中':'HZG', '黄山':'TXN', '呼伦贝尔':'XRQ', '中国嘉义':'CYI', '景德镇':'JDZ', '加格达奇':'JGD', '嘉峪关':'JGN', '井冈山':'JGS', '金昌':'JIC', '九江':'JIU', '荆门':'JM1', '佳木斯':'JMU', '济宁':'JNG', '锦州':'JNZ', '建三江':'JSJ', '鸡西':'JXA', '九寨沟':'JZH', '中国金门':'KNH', '揭阳':'SWA', '库车':'KCA', '康定':'KGT', '喀什':'KHG', '凯里':'KJH', '库尔勒':'KRL', '克拉玛依':'KRY', '黎平':'HZH', '澜沧':'JMJ', '龙岩':'LCX', '临汾':'LFQ', '兰州':'LHW', '丽江':'LJG', '荔波':'LLB', '吕梁':'LLV', '临沧':'LNJ', '陇南':'LNL', '六盘水':'LPF', '拉萨':'LXA', '洛阳':'LYA', '连云港':'LYG', '临沂':'LYI', '柳州':'LZH', '泸州':'LZO', '林芝':'LZY', '芒市':'LUM', '牡丹江':'MDG', '中国马祖':'MFK', '绵阳':'MIG', '梅州':'MXZ', '中国马公':'MZG', '满洲里':'NZH', '漠河':'OHE', '南昌':'KHN', '中国南竿':'LZN', '南充':'NAO', '宁波':'NGB', '宁蒗':'NLH', '南宁':'NNG', '南阳':'NNY', '南通':'NTG', '攀枝花':'PZI', '普洱':'SYM', '琼海':'BAR', '秦皇岛':'BPE', '祁连':'HBQ', '且末':'IQM', '庆阳':'IQN', '黔江':'JIQ', '泉州':'JJN', '衢州':'JUZ', '齐齐哈尔':'NDG', '日照':'RIZ', '日喀则':'RKZ', '若羌':'RQA', '神农架':'HPG', '莎车':'QSZ', '沈阳':'SHE', '石河子':'SHF', '石家庄':'SJW', '上饶':'SQD', '三明':'SQJ', '十堰':'WDS', '邵阳':'WGN', '松原':'YSQ', '台州':'HYN', '中国台中':'RMQ', '塔城':'TCG', '腾冲':'TCZ', '铜仁':'TEN', '通辽':'TGO', '天水':'THQ', '吐鲁番':'TLQ', '通化':'TNH', '中国台南':'TNN', '中国台北':'TPE', '中国台东':'TTT', '唐山':'TVS', '太原':'TYN', '五大连池':'DTU', '乌兰浩特':'HLH', '乌兰察布':'UCB', '乌鲁木齐':'URC', '潍坊':'WEF', '威海':'WEH', '文山':'WNH', '温州':'WNZ', '乌海':'WUA', '武夷山':'WUS', '无锡':'WUX', '梧州':'WUZ', '万州':'WXN', '乌拉特中旗':'WZQ', '巫山':'WSK', '兴义':'ACX', '夏河':'GXH', '中国香港':'HKG', '西双版纳':'JHG', '新源':'NLT', '忻州':'WUT', '信阳':'XAI', '襄阳':'XFN', '西昌':'XIC', '锡林浩特':'XIL', '西宁':'XNN', '徐州':'XUZ', '延安':'ENY', '银川':'INC', '伊春':'LDS', '永州':'LLF', '榆林':'UYN', '宜宾':'YBP', '运城':'YCU', '宜春':'YIC', '宜昌':'YIH', '伊宁':'YIN', '义乌':'YIW', '营口':'YKH', '延吉':'YNJ', '烟台':'YNT', '盐城':'YNZ', '扬州':'YTY', '玉树':'YUS', '岳阳':'YYA', '张家界':'DYG', '舟山':'HSN', '扎兰屯':'NZL', '张掖':'YZY', '昭通':'ZAT', '湛江':'ZHA', '中卫':'ZHY', '张家口':'ZQZ', '珠海':'ZUH', '遵义':'ZYI'
        # 确保添加了所有需要的城市和机场代码
    }
    start_code = txt.get(start_address)
    end_code = txt.get(arrival_address)

    if not start_code or not end_code:
        return '请确定输入的起始地是否正确'

    try:
        # 获取去程价格信息
        outbound_data = fetch_ticket_prices(start_code, end_code)
        # 获取返程价格信息
        return_data = fetch_ticket_prices(end_code, start_code)

        str_result = "去程票价信息:\n"
        lowest_outbound_price = float('inf')
        lowest_outbound_date = ''

        for date, price in outbound_data.items():
            str_result += get_str(date, start_address, arrival_address, price)
            if price < lowest_outbound_price:
                lowest_outbound_price = price
                lowest_outbound_date = date

        str_result += "返程票价信息:\n"
        lowest_return_price = float('inf')
        lowest_return_date = ''

        for date, price in return_data.items():
            str_result += get_str(date, arrival_address, start_address, price)
            if price < lowest_return_price:
                lowest_return_price = price
                lowest_return_date = date

        # 添加最低价格的特别说明
        if lowest_outbound_date:
            str_result += "\ntips:去程中最低的机票价格为 {} 元,日期为 {}。\n".format(lowest_outbound_price,
                                                                                        lowest_outbound_date)
        if lowest_return_date:
            str_result += "tips:返程中最低的机票价格为 {} 元,日期为 {}。\n".format(lowest_return_price,
                                                                                      lowest_return_date)

        # 发送到QQ
        qmsg_response = send_message_via_qmsg(str_result, 'qq1,qq2')
        return qmsg_response
    except Exception as e:
        print(f"An error occurred: {e}")
        return {}


# 使用示例
if __name__ == "__main__":
    start_address = "北京"
    arrival_address = "上海"
    response = main_handler(start_address, arrival_address)
    print(response)



2.推送同样选择qmsg,客户端使用NT docker自建版本,默认版本使用的是作者的机器人,有很多发言限制,长数字比如日期啥的
属于违规内容,无法正常推送,NT自建版本则没有任何限制


因为我需要和朋友都关注信息,所以使用的是qmsg的群推送功能,只需要将qmsg接口中的send替换为group即可,上图设置中给群授权才可正常推送群消息
具体内容可以查看qmsg的官方api文档。qmsg作者也是一位开源大佬,客户端和服务器都可以自己部署,有兴趣的小伙伴可以自己动手搭建

3.部署
python程序可以部署在很多平台,我采用的是部署在linux服务器上,即跟qmsg NT部署在同一台服务器上,crantab定时每小时执行一次
当然你也可以部署在云函数上
避坑:每小时整点规则是0 */1 * * *,或者*/60 * * * *,注意不要写成* */1 * * * 哦

4.效果图如下
d0d50122d41b37368ff7cefb84ac9b0.jpg





免费评分

参与人数 6吾爱币 +12 热心值 +6 收起 理由
wuwuweijunx + 1 + 1 谢谢@Thanks!
m1keyjohhny + 1 + 1 我很赞同!
j030110 + 1 + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
laozhang4201 + 1 + 1 热心回复!
junjia215 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

j030110 发表于 2024-6-18 17:10
自己写的一个!
1718701769695.png
一生不变BBS 发表于 2024-6-9 20:04
greatzdl 发表于 2024-6-10 11:04
rxxcy 发表于 2024-6-11 09:17
code高亮炸了
苏紫方璇 发表于 2024-6-11 13:19
代码插入可以参考这个帖子
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie.cn/thread-713042-1-1.html
(出处: 吾爱破解论坛)
 楼主| cuterror 发表于 2024-6-11 15:13
苏紫方璇 发表于 2024-6-11 13:19
代码插入可以参考这个帖子
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie.cn/thr ...

谢谢,我去学习下,我写的时候代码看着很正常,一发布就变成那样了。。。
 楼主| cuterror 发表于 2024-6-11 15:14

第一次发帖粘代码,多包涵
 楼主| cuterror 发表于 2024-6-11 15:23
greatzdl 发表于 2024-6-10 11:04
可以推送weixin群嘛

可以的,微信推送机器人也有很多,你可以上github上看看,闲了我找个适配一下
nicho666 发表于 2024-7-27 10:27
本帖最后由 nicho666 于 2024-7-27 10:57 编辑

去程最便宜7月28日,回城最便宜10月15日,我要过去玩3个月吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-11 20:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表