标签归档:eBay

PhantomJS 模拟登录一

"use strict";

var webpage = require('webpage');
var page = webpage.create();

/// 登录页
page.open('https://signin.sandbox.ebay.com/ws/eBayISAPI.dll', function (status) {
	if (status === "success") {
		var cookies = page.cookies;
		for(var i in cookies) {
			console.log(cookies[i].name + '=' + cookies[i].value);
		}
		//console.log(page.content);
		page.close();

		/// 登录
                // 需要提取其它的表单字段
		var postData = 'userid=testuser_xxx&pass=xxx';

		var login = webpage.create();
		login.open('https://signin.sandbox.ebay.com/ws/eBayISAPI.dll?co_partnerId=2&siteid=0&UsingSSL=1', 'POST', postData, function (status) {
		  if (status === "success") {

			var cookies = login.cookies;
			var saveData = '';
			for(var i in cookies) {
				console.log(cookies[i].name + '=+' + cookies[i].value);
				saveData += cookies[i].name+"="+cookies[i].value+"&";
			}

			//console.log(login.content);
			login.close();

			///	成功登录后发送数据
			var save = webpage.create();
			save.open('http://120.24.42.192:7070/i.php', 'POST', saveData, function (status) {
			  if (status === "success") {

				console.log(save.content);
				save.close();

				///
			  }
			  phantom.exit();
			});
		  } else {
			 console.log("Login Failed...");
			 phantom.exit();
		  }
		  
		});
	} else {
		phantom.exit();
	}
});

这里的phantom可以看做是浏览器进程,调用exit()方法表示直接关闭浏览器。page相当于浏览器中的Tab(开一个tab,跟建一个page概念相同),Tab或叫page打开以后,需要给一个URL,然后把这些个内容加载回来,然后在浏览器中就可以点击了,而在PhantomJs中,需要通过接口去模拟点击,要操作这个page,可以玩的花样很多,比如往这个page中注入一段JS,包含一个JS文件,修改DOM的内容,提交表单等等。page的evaluate方法一定程度上,可以看做是

eBay API 之 Feedback

一个eBay账户可以卖东西也买东西,分别扮演卖家和买家。eBay对每一个产品的付款称为一个交易,如果购买了多个产品就有多次交易。eBay的Feedback是针对交易的(不是针对订单),这个必须清楚。作为买家和卖家,都可以给对方留Feedback和接收对方的Feedback(作为卖家接收Feedback,作为买家接收Feedback),也可以回复对方的Feedback,针对回复,作为买卖家,还可以Followup。

以下分开解释:
作为卖家,买家留评(卖家接收到评价),卖家针对买家的评价(好中差评)进行回复,买家收到回复后还可以辩解一下,针对回复来一次Followup。

作为买家,卖家留评(买家接收到评价),买家针对卖家的评价(好中差评)进行回复,卖家收到回复后还可以辩解一下,针对回复来一次Followup。

作为卖家,一般会在付款完成之后就会给买家好评,买家一般都不会回复这个评价,真正关心评价的是作为卖家,所以只需要实现卖家这边的功能即可,虽然eBay的Feedback API实现了双向交互。

那么流程就是如下:
1 以卖家的身份获取评价(买家留评,卖家接收到评价)

<?xml version="1.0" encoding="utf-8"?> 
<GetFeedbackRequest xmlns="urn:ebay:apis:eBLBaseComponents"> 
  <DetailLevel>ReturnAll</DetailLevel> 
  <FeedbackType>FeedbackReceivedAsSeller</FeedbackType> 
  <CommentType>Positive</CommentType> 
  <RequesterCredentials> 
    <eBayAuthToken>SellerToken</eBayAuthToken> 
  </RequesterCredentials> 
</GetFeedbackRequest>

CommentType用来过滤好中差评,FeedbackType用来过滤接收到的评价的接收实体是卖家还是买家。如果不区分好中差评,去掉CommentType过滤条件即可。如果不区分接收实体是卖家还是买家,去掉FeedbackType过滤条件即可。实际上,返回的具体的Feedback中,有一个Role的字段,用来表明这个Feedback接收主体,一般应该使用FeedbackType来过滤Feedback,返回结果的Role字段可以直接忽略它,因为我们是做卖家工具,不是做买家工具,如果是做买家工具,获取卖家给买家的Feedback才有意义。

2 回复买家给的评价(一般是在中差评时回复)
参考文档(就发送一条信息)。

关于Feedback同步,GetFeedback并不支持时间段过滤,最新的评价总会排在GetFeedback结果的前面,所以只要每天同步前面几页Feedback即可,Feedback一旦下载,回复的时候可以把回复的信息也写入到本地,这样就相当于本地和远程都同步了。

eBay的Feedback还有以下更细的内容,比如评价是否被屏蔽等,可以参考API文档。

eBay用户授权流程

ebay-developer
往下翻,点击Customize the eBay User Consent Form,找到Manage Your RuNames部分,然后点击Generate Runame,这样就会产生一个所谓的RuName,长成这个样子”vfeelit-vfeelit1d-65eb–tboemfhvb”,可以点击多次产生多个RuName,不过看起来没有什么必要,那么RuName是什么毛呢,先看看针对它的配置吧,在对应字符串右边点击Show Details,将展示如下表单:
eBay RuName
Display Title和Display Description是展示给用户看的标题和描述,这个信息可以在Application Level Settings中设置Show Application Details为enabled或disabled来设置,还可以上传Logo,这些信息是在用户点击同意授权时展示的出来给用户看的。

Token Return Method设置如何获取Token,Authorization Type为授权类型,Accept Redirect URL为成功授权后跳转到的地址,Reject Redirect URL授权被拒绝时跳转到的地址。实际上这里的值只要默认就可以了,关于Accept Redirect URL和Reject Redirect URL如果要设置,必须是HTTPS的链接地址,实际设置这两个变量毫无意义,因为它不会回传任何信息到这两个URL。所以,RuName实际上是一个Application的标识符(别名),它设置了相关的认证类型,Token获取方式等等,比如当用户授权成功后,就需要用这里设置的Token Return Method来获取Token。

对于一个应用,只要设置一个RuName即可。多个RuName也支持。这个步骤完成后应用就支持多用户授权了。

授权过程,步骤如下:
1 调用GetSessionID获取一个SessionID
这个API调用详细参考:http://developer.ebay.com/Devzone/XML/docs/Reference/ebay/GetSessionID.html,这里面如果是发送XML,只要发送RuName即可:

<?xml version="1.0" encoding="utf-8"?>
<GetSessionIDRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <!-- Call-specific Input Fields -->
  <RuName> string </RuName>
  <!-- Standard Input Fields -->
  <ErrorLanguage> string </ErrorLanguage>
  <MessageID> string </MessageID>
  <Version> string </Version>
  <WarningLevel> WarningLevelCodeType </WarningLevel>
</GetSessionIDRequest>

从返回提取SessionID即可。

2 用获取到的SessionID构建URL
URL格式:https://signin.ebay.com/ws/eBayISAPI.dll?SignIn&RUName=RUName&SessID=SessionID,SessionID需要经过URL-encoded,然后定位到这个URL,这样将打开用户登录表单,用户登录成功后将跳到一个是否同意授权的页面:
eBay 用户登录
登录后跳到:
授权应用
这个的Grant application access后的名称就是设置RuName是指定的Display Title,这就说明RuName可以看做是Application。最下面展示的是应用的信息,这个可以在开发者账户中进行设置。点击I agree跳转到如下页:
ebay_auth_success
这个也是可以设置的。前面已经论述。这里叫你去关闭这个页。TMD,这就完了,然后接下来要发起获取Token的操作,这个过程明显让我们感觉整个流程被中断了。我们观察一下这个返回的URL:https://signin.ebay.com/ws/eBayISAPI.dll?ThirdPartyAuthSucessFailure&isAuthSuccessful=true&ebaytkn=&tknexp=1970-01-01+00%3A00%3A00&username=testuser_vfeelit,问号之前的是可以设置的(需要HTTPS),后面的数据是固定的,isAuthSuccessful参数表明是否成功,username指出了eBay用户名,应该只要设置一下应用的返回地址,根据这些参数,也是可以自动获取Token的(流程不中断,因为获取到了username)

3 获取Token
以上两个步骤完成后,只是说明用户对应用进行了授权,但是授权码应用程序还没有获取到,这个时候调用FetchToken(传递eBay ID),就能返回针对这个账户的Token。

4 保存这个Token和有效时间
Token保存起来后就可以使用这个Token来访问API操作对应账户数据了。

这个过程看起来并没有比oAuth 2先进多少,这个流程过程中的中断让人产生困惑,虽然可以设置Accept Redirect URL,但是它要求是HTTPS的链接。

Ebay E邮宝API开发

开发者专区(总入口)
http://www.ebay.cn/developer/
国际e邮宝API V3
http://www.ebay.cn/developer/single/epacket.html
国际e邮宝API V4 (eBay亚太物流平台API)
http://www.ebay.cn/developer/single/APAC-SHIPPING.html
说明:V3还可用,以后全面转换成V4(原计划是2014-10-10,后推迟)

1 注册开发者账户
https://developer.ebay.com/devzone/account
在My Account页获取生成一组Key(分开发环境 和 生产环境)

2 注册Sandbox账户
打开www.sandbox.ebay.com,点击Get Started下的eBay Sandbox User Registration链接,会跳转到developer.ebay.com,要求用开发者账户先登录,登录后跳到eBay Sandbox User Registration Tool开始注册账户,用户名统一以TESTUSER_开头,注册类型只有Buyer and Seller,说明既可以是买家,也可以是卖家,也可以再次注册一个账户,分别模拟买家卖家。

也可以登录开发者账户后在tools下点击Sandbox User Registration链接进行Sandbox账户注册。

3 产生User Token
实际就是eBay用户对开发者或APP的授权码,可以在开发账户中的Tools下面点击Get a User Token获取,点击后跳转到key选择页面,输入(或选择环境或Key),然后点击Continue to generate token,然后跳转到授权登录页面,使用之前支持的账户进行登录(表示这个账户授权到开发者账户),输入账户密码登录后跳到一个授权提醒页面,点击I agree,然后弹出结果,点击Save Token。

4 使用对应的授权码访问API(操作授权码对应的店铺)

如果刚开始接触API开发,往往在账户授权这里被卡住,有点难理解。实际上,这里申请的开发者账户可以看做是一个应用程序(至少是代表),现在这个应用程序要获取你账户(eBay账户或eBay账户对应的EUB)里面的信息,这里就涉及到两个问题。第一,数据如何访问,第二,如何授权这个应用程序访问这些个人数据。对第一个问题,自然是通过提供API访问了,但是访问前必须先获取授权,这就是第二个问题。关于授权,业界有成熟的解决方案OAuth 2,它用得非常普遍。但是eBay没有采用OAuth 2,它自己实现了一套授权逻辑(不过跟OAuth 2也有类似地方),过程这里先跳过了,最终结果是eBay卖家输入了它的账户密码点击同意授权,应用程序将接收到一个很长的字符串,美其名曰Token。应用程序在使用API时,这个Token是必须传递的,Token是有有效期的,会不会导致它泄露呢,理论是不会的,因为它作为POST数据的一部分通过HTTPS进行传递。就算泄露了Token,要访问API时还要知道AppKey已经对应的签名等。

以下是一段来自官方的例子:

error_reporting(E_ALL);
$compatabilityLevel = 717;    // eBay API version

$devID = "95a9c0d-1cad-4fda-b74d-b610efbb560";
$appID = "EBTCo63ba-b11-4e96-b0c3-b4dd064239";
$certID = "f2fd3c8-18d4-4419-8fd3-72ae811829f";
$serverUrl = "https://api.sandbox.ebay.com/ws/api.dll";
$userToken = "xxxxxxxxxxxxxx";

$siteID = 0;
//要调用的API
$verb = 'GetTokenStatus';
 
$headers = array (
    'X-EBAY-API-COMPATIBILITY-LEVEL: ' . $compatabilityLevel,
    'X-EBAY-API-DEV-NAME: ' . $devID,
    'X-EBAY-API-APP-NAME: ' . $appID,
    'X-EBAY-API-CERT-NAME: ' . $certID,
             
    //the name of the call we are requesting
    'X-EBAY-API-CALL-NAME: ' . $verb,           
             
    //SiteID must also be set in the Request's XML
    //SiteID = 0  (US) - UK = 3, Canada = 2, Australia = 15, ....
    //SiteID Indicates the eBay site to associate the call with
    'X-EBAY-API-SITEID: ' . $siteID,
);
 
//POST的数据,一个XML字符串
$requestXmlBody = '<?xml version="1.0" encoding="utf-8"?>
<GetTokenStatusRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <RequesterCredentials>
    <eBayAuthToken>'.$userToken.'</eBayAuthToken>
  </RequesterCredentials>
</GetTokenStatusRequest>';
 
//使用CURL发送数据        
//initialise a CURL session
$connection = curl_init();
//set the server we are using (could be Sandbox or Production server)
curl_setopt($connection, CURLOPT_URL, $serverUrl);
         
//stop CURL from verifying the peer's certificate
curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0);
         
//set the headers using the array of headers
curl_setopt($connection, CURLOPT_HTTPHEADER, $headers);
         
//set method as POST
curl_setopt($connection, CURLOPT_POST, 1);
         
//set the XML body of the request
curl_setopt($connection, CURLOPT_POSTFIELDS, $requestXmlBody);
         
//set it to return the transfer as a string from curl_exec
curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1);
         
//Send the Request
$response = curl_exec($connection);
         
//close the connection
curl_close($connection);
 
header("Content-type: text/xml");
print_r($response);  

返回的XML:

<GetTokenStatusResponse><Timestamp>2014-11-19T15:16:41.219Z</Timestamp><Ack>Success</Ack><Version>893</Version><Build>E893_CORE_API_17097905_R1</Build><TokenStatus><Status>Active</Status><EIASToken>nY+sHZ2PrBmdj6wVnY+sEZ2PrA2dj6wFk4GhDJmKogudj6x9nY+seQ==</EIASToken><ExpirationTime>2016-05-12T15:04:46.000Z</ExpirationTime></TokenStatus></GetTokenStatusResponse>

EBay Api顺利通过沙盒测试,但是我这里的E邮宝V4.0.0沙盒测试一直失败,起初以为是账户等信息不对,换了几次,总是提醒Token无效,但是通过EBay Api测试Token是有效的(如上代码运行结果)。后来我直接到Ebay香港注册了个真实的Ebay账户,然后授权到真实的开发者账户,测试就通过:

$serverUrl="https://api.apacshipping.ebay.com.hk/aspapi/v4/ApacShippingService";

$request=array();
$request["APIDevUserID"]="xxxxx";
$request["APISellerUserToken"]="00000";
$request["APISellerUserID"]="xxxxx";
$request["AppID"]="EBTCo1d7-1e69-4cbf-adbf-7c47209ab";
$request["AppCert"]="45d1d5c-d54c-4381-bd3b-f9b0949479";
$request["MessageID"]="";
$request["Version"]="4.0.0";
$request["Carrier"]="CNPOST";
//$request["Service"]="EPACK";

$client = new SoapClient($serverUrl."?wsdl");
$r = $client->VerifyAPACShippingUser(array("VerifyAPACShippingUserRequest"=>$request));

print_r($r);

///输出
stdClass Object
(
    [VerifyAPACShippingUserResult] => stdClass Object
        (
            [Version] => 4.0.0
            [Ack] => Success
            [Message] => VerifyAPACShippingUser succeeded
            [Timestamp] => 2014-11-20T06:58:05.989-07:00
            [InvocationID] => F4C3C334D173429BA38538986C620B1D
            [CarrierList] => stdClass Object
                (
                    [CarrierGeo] => stdClass Object
                        (
                            [Carrier] => CNPOST
                            [FromCountryCode] => CN
                        )

                )

        )

)

看起来,E邮宝v4.0.0服务还有待完善。

附加信息,E邮宝实际是一个独立的服务,是要注册账户的,你可以使用你的Ebay账户(仅限香港注册的)去注册一个E邮宝账户,这样你的这个EBay账户也就是E邮宝账户,同时你的Ebay账户默认会被添加到管理账户的卖家列表中,你可以继续添加Ebay账户进来,就是一个E邮宝账户对应多个Ebay账户,在调用E邮宝API时,参数APISellerUserID是必填的,它是能定位到E邮宝的中设置的的Ebay账户。

只要通过Ebay的API认证,就能调用E邮宝的API管理物流发货。