signature=1be7575a614ba3597c2c53247a739d1c,错误openssl_sign(): supplied key param cannot be coerced in...

这段代码展示了如何使用PHP处理RSA的私钥和公钥,进行数据签名和验证。私钥通过`chunk_split`函数格式化,然后用`openssl_sign`进行签名;公钥同样处理后,使用`openssl_verify`进行签名验证。涉及到的技术包括RSA、MD5哈希和SHA1哈希。

原因:RSA 的秘钥一般都有固定换行格式

私钥:

$str=’私钥(改成一行)’;

$str = chunk_split($str, 64, "\n");

$key = "-----BEGIN RSA PRIVATE KEY-----\n$str-----END RSA PRIVATE KEY-----\n";

$signature = '';

if (openssl_sign($data, $signature, $key, OPENSSL_ALGO_MD5)) {

echo base64_encode($signature);

}

公钥:

$data='内容';

$str='公钥(改成一行)';

$str = chunk_split($str, 64, "\n");

$key = "-----BEGIN PUBLIC KEY-----\n$str-----END PUBLIC KEY-----\n";

$signature = "";

if (openssl_verify(base64_decode($data), $signature, $key, OPENSSL_ALGO_MD5) == 1) {

echo $signature;

}

openssl(SHA1WithRSA) 签名 验签

//签名:

public function wjSign($data){

$key = openssl_pkey_get_private(file_get_contents($this->privateKeyPathWJ));

openssl_sign($data, $sign, $key, OPENSSL_ALGO_SHA1);

$sign = base64_encode($sign);

return $sign;

}

//验签:

public function wjVerify($data, $sign){

$sign = base64_decode($sign);

$key = openssl_pkey_get_public(file_get_contents($this->publicKeyPathWJ));

$result = openssl_verify($data, $sign, $key, OPENSSL_ALGO_SHA1) === 1;//1成功 0失败 -1错误

return $result;

}

<?xml version="1.0" encoding="utf-8"?> <profiles xmlns="http://www.logitech.com/Cassandra/2010.7/Profile"> <profile gpasupported="0" guid="{8977B654-FA93-4E7A-8DD1-E09045D7AABF}" gameid="" lock="0" gkeysdk="0" launchable="1" lastplayeddate="2021-01-04T00:05:25" name="食鸡模式"> <description></description> <target path="J:\GAMES\CYBERPUNK.2077.PRELOAD.GOGRIP-INSANERAMZES\CYBERPUNK 2077\REDPRELAUNCHER.EXE"/> <signature value="" key="" name="" executable=""/> <macros> <macro original="true" guid="{01E20D9C-6574-4BBA-8D0D-E25BE4027F2F}" color="4278246655" hidden="true" name="左键单击"> <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction"> <do task="leftclick"/> </mousefunction> </macro> <macro original="true" guid="{94423986-29AA-4706-9C10-FA4A4766E852}" color="4278246655" hidden="true" name="右键单击"> <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction"> <do task="rightclick"/> </mousefunction> </macro> <macro original="true" guid="{81DDE469-DCE6-43B0-8E2E-A739E910B35B}" color="4278246655" hidden="true" name="单击中键"> <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction"> <do task="middleclick"/> </mousefunction> </macro> <macro original="true" guid="{D2F7FA32-51D4-4245-A623-29E47014CFC1}" color="4278246655" hidden="true" name="返回"> <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction"> <do task="back"/> </mousefunction> </macro> <macro original="true" guid="{2377C3C1-8C55-4879-AACE-987FCB6FF9B5}" color="4278246655" hidden="true" name="前进"> <mousefunction xmlns="http://www.logitech.com/Cassandra/2010.1/Macros/MouseFunction"> <do task="forward"/> </mousefunction> </macro> <macro original="true" guid="{CAB40FE5-DDB3-4761-8798-710674CB6FF2}" color="42
04-01
import requests from bs4 import BeautifulSoup import pandas as pd import time import random from urllib.parse import quote import json headers = { 'access-control-allow-credentials true' 'access-control-allow-headers content-type,x-ctx-currency,x-ctx-locale,x-ctx-ubt-pageid,x-ctx-ubt-pvid,x-ctx-ubt-sid,x-ctx-ubt-vid' 'access-control-allow-methods POST' 'access-control-allow-origin https://you.ctrip.com' 'access-control-expose-headers x-service-call' 'access-control-expose-headers x-gate-region' 'access-control-expose-headers slb-http-protocol-version' 'content-length 0' 'content-type text/html' 'date Mon, 19 May 2025 04:26:13 GMT' 'slb-http-protocol-version HTTP/2.0' 'x-gate ctrip-gate' 'x-gate-region SHAXY' 'x-gate-root-id 100025527-0a739a0f-485452-1305989' 'x-originating-url https://m.ctrip.com/restapi/soa2/28967/reportInjectFnInfo?_fxpcqlniredt=09031077312951608849&x-traceID=09031077312951608849-1747628780641-5951399' } def search_attraction(attraction_name, city_code='30'): search_url = f"https://m.ctrip.com/restapi/soa2/28967/reportInjectFnInfo?_fxpcqlniredt=09031077312951608849&x-traceID=09031077312951608849-1747628780641-5951399" try: response = requests.get(search_url, headers=headers) response.raise_for_status() data = response.json() content = data['data']['content'] if 'data' in data and 'content' in data['data']: for item in data['data']['content']: if item.get('type') == 'sight': return item.get('id'), item.get('name') return None, None except Exception as e: print(f"搜索景点出错: {e}") return None, None print(type(data['data']['content'])) def get_attraction_hotels(attraction_id, attraction_name, city_code='30', radius=2, page=1): hotel_url = f"https://api.map.baidu.com/images/blank.gif?product=jsapi&sub_product=jsapi&v=2.0&sub_product_v=2.0&t=26639547&code=5054&da_src=5054&pic=16" payload = { "bizFilter": { "radius": radius, "landmarkId": attraction_id, "landmarkType": 1, "landmarkName": attraction_name }, "cityId": city_code, "sortType": 9, "pageIndex": page, "pageSize": 20, "sourceFrom": 2, "arrivalDate": "2025-05-19", "departureDate": "2025-05-20", "includeSoldOut": True, "needRoomMessage": False, "travelPurpose": 0, "supportDigitalCheckIn": False, "needRoomQuotas": False, "priceRange": "0,0", "star": "0,5", "facility": [], "brand": [], "group": [], "promotion": [], "paymentType": [], "bedType": [], "cancelPolicy": [], "prepay": [], "specialOffer": [], "hotelName": "", "isOnlyHotel": False, "requestTravelMoney": False, "needHotelRemarks": False, "needMemberPrice": True, "currency": "CNY", "needSatisfaction": False, "supportMultipleRooms": False, "isFlashSale": False, "showFlashSaleTag": False, "needBasicPoint": False, "needCancelPolicy": False, "needVipPrice": False, "needGroupRoom": False, "isPackage": False, "isJustConfirm": False, "isJustOrder": False, "needHotelPromotion": False, "needPriceTips": False, "needCancelFee": False, "needRoomTags": False, "needPrepayment": False, "needRoomQuotas": False, "needRoomQuotas": False, "needBasicPoint": False, "needCancelPolicy": False, "needVipPrice": False, "needGroupRoom": False, "isPackage": False, "isJustConfirm": False, "isJustOrder": False, "needHotelPromotion": False, "needPriceTips": False, "needCancelFee": False, "needRoomTags": False, "needPrepayment": False } try: response = requests.post(hotel_url, headers=headers, json=payload) response.raise_for_status() data = response.json() hotels = [] if 'hotelPositionJSON' in data: for hotel in data['hotelPositionJSON']: hotel_info = { 'hotel_id': hotel.get('hotelId'), 'hotel_name': hotel.get('name'), 'distance': hotel.get('distance'), 'price': hotel.get('lowestPrice'), 'rating': hotel.get('hotelStar'), 'address': hotel.get('address'), 'latitude': hotel.get('lat'), 'longitude': hotel.get('lng'), 'landmark_name': attraction_name, 'landmark_id': attraction_id } hotels.append(hotel_info) return hotels, data.get('totalCount', 0) except Exception as e: print(f"获取酒店数据出错: {e}") return [], 0 def main(): attraction_name = input("请输入要搜索的景点名称: ") city_code = input("请输入城市代码(默认上海为30): ") or "30" radius = int(input("请输入搜索半径(公里,默认2公里): ") or "2") max_pages = int(input("请输入最大爬取页数(默认3页): ") or "3") # 搜索景点 attraction_id, attraction_name = search_attraction(attraction_name, city_code) if not attraction_id: print(f"未找到景点: {attraction_name}") return print(f"找到景点: {attraction_name}, ID: {attraction_id}") print(f"开始爬取{attraction_name}附近{radius}公里内的酒店数据...") all_hotels = [] current_page = 1 total_count = 0 while current_page <= max_pages: print(f"正在爬取第 {current_page} 页...") hotels, total_count = get_attraction_hotels( attraction_id, attraction_name, city_code, radius, current_page ) all_hotels.extend(hotels) if not hotels or len(hotels) == 0: print("没有更多酒店数据") break print(f"已爬取 {len(hotels)} 家酒店,总共已爬取 {len(all_hotels)} 家酒店") delay = random.uniform(2, 5) print(f"等待 {delay:.2f} 秒后继续爬取下一页...") time.sleep(delay) current_page += 1 if all_hotels: df = pd.DataFrame(all_hotels) filename = f"{attraction_name}_附近酒店数据.csv" df.to_csv(filename, index=False, encoding='utf-8-sig') print(f"数据已保存到文件: {filename}") print(f"总共爬取了 {len(all_hotels)} 家酒店数据") print("\n前5条酒店数据示例:") print(df.head().to_csv(sep='\t', na_rep='nan')) else: print("未爬取到任何酒店数据") if __name__ == "__main__": main()为什么运行结果出现:搜索景点出错: 'set' object has no attribute 'items'
最新发布
07-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值