tietuku.class.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. <?php
  2. /**
  3. * PHP SDK for tietuku.com
  4. *
  5. * @author Tears <i@ltteam.cn>, qakcn <qakcnyn@gmail.com>
  6. */
  7. /**
  8. * 贴图库 Token 生成类
  9. *
  10. * 生成机制说明请大家参考贴图库开放平台文档:{@link http://open.tietuku.com/doc#safe-token}
  11. *
  12. * @package TieTuKu
  13. * @author Tears, qakcn
  14. * @version 1.0
  15. */
  16. class TieTuKuToken
  17. {
  18. /**
  19. * @ignore
  20. */
  21. public $accesskey;
  22. /**
  23. * @ignore
  24. */
  25. public $secretkey;
  26. /**
  27. * @ignore
  28. */
  29. private $base64param;
  30. /**
  31. * 构造函数
  32. *
  33. * @access public
  34. * @param mixed $accesskey 贴图库平台accesskey
  35. * @param mixed $secretkey 贴图库平台secretkey
  36. * @return void
  37. */
  38. public function __construct($accesskey, $secretkey)
  39. {
  40. if ($accesskey == '' || $secretkey == '') {
  41. return false;
  42. }
  43. $this->accesskey = $accesskey;
  44. $this->secretkey = $secretkey;
  45. }
  46. /**
  47. * 将参数进行JSON格式化并且进行url安全的base64编码
  48. *
  49. * @param array $param 接口所需要的参数
  50. * @return mixed 返回该类 可进行连续操作
  51. */
  52. public function dealParam($param)
  53. {
  54. $this->base64param = $this->URLSafeBase64Encode(json_encode($param));
  55. return $this;
  56. }
  57. /**
  58. * 生成Token方法
  59. * 需要先调用dealParam方法否则返回false
  60. *
  61. * @return string 成功生成的Token 失败返回false
  62. */
  63. public function createToken()
  64. {
  65. if (empty($this->base64param)) {
  66. return false;
  67. }
  68. $sign = $this->signEncode($this->base64param, $this->secretkey);
  69. return $this->accesskey . ':' . $this->URLSafeBase64Encode($sign) . ':' . $this->base64param;
  70. }
  71. /**
  72. * Token hash加密方法
  73. *
  74. * @param string $str 需要进行hash加密的字符串
  75. * @param string $key secretkey
  76. * @return string hash_hmac sha1 加密后的字符串
  77. */
  78. public function signEncode($str, $key)
  79. {
  80. $hmac_sha1_str = "";
  81. if (function_exists('hash_hmac')) {
  82. $hmac_sha1_str = hash_hmac("sha1", $str, $key, true);
  83. } else {
  84. $blocksize = 64;
  85. $hashfunc = 'sha1';
  86. if (strlen($key) > $blocksize) {
  87. $key = pack('H*', $hashfunc($key));
  88. }
  89. $key = str_pad($key, $blocksize, chr(0x00));
  90. $ipad = str_repeat(chr(0x36), $blocksize);
  91. $opad = str_repeat(chr(0x5c), $blocksize);
  92. $hmac_sha1_str = pack('H*', $hashfunc(($key ^ $opad) . pack('H*', $hashfunc(($key ^ $ipad) . $str))));
  93. }
  94. return $hmac_sha1_str;
  95. }
  96. /**
  97. * url安全的base64编码 URLSafeBase64Encode
  98. *
  99. * @param string $str 需要进行url安全的base64编码的字符串
  100. * @return string 返回url安全的base64编码字符串
  101. */
  102. public function URLSafeBase64Encode($str)
  103. {
  104. $find = array('+', '/');
  105. $replace = array('-', '_');
  106. return str_replace($find, $replace, base64_encode($str));
  107. }
  108. }
  109. /**
  110. * 贴图库 客户端操作类
  111. *
  112. *
  113. * @package TieTuKu
  114. * @author Tears
  115. * @version 1.0
  116. */
  117. class TTKClient
  118. {
  119. /**
  120. * Set up the API root URL.
  121. *
  122. * @ignore
  123. */
  124. public $upload_host = "http://up.tietuku.com/";
  125. public $host = "http://api.tietuku.com/v1/";
  126. /**
  127. * Set timeout default.
  128. *
  129. * @ignore
  130. */
  131. public $timeout = 60;
  132. /**
  133. * Set CURL timeout.
  134. *
  135. * @ignore
  136. */
  137. public $CURLtimeout = 30;
  138. /**
  139. * 构造函数
  140. *
  141. * @access public
  142. * @param mixed $accesskey 贴图库平台accesskey
  143. * @param mixed $secretkey 贴图库平台secretkey
  144. * @return void
  145. */
  146. public function __construct($accesskey, $secretkey)
  147. {
  148. $this->op_Token = new \TieTuKuToken($accesskey, $secretkey);
  149. }
  150. /**
  151. * 查询随机30张推荐的图片
  152. *
  153. * 对应API:{@link http://open.tietuku.com/doc#list-getrandrec}
  154. *
  155. * @access public
  156. * @param boolean $createToken 是否只返回Token,默认为false。
  157. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  158. */
  159. public function getRandRec($createToken = false)
  160. {
  161. $url = $this->host . "/List/";
  162. $param['deadline'] = time() + $this->timeout;
  163. $param['action'] = 'getrandrec';
  164. $Token = $this->op_Token->dealParam($param)->createToken();
  165. $data['Token'] = $Token;
  166. return $createToken ? $Token : $this->post($url, $data);
  167. }
  168. /**
  169. * 根据类型ID查询随机30张推荐的图片
  170. *
  171. * 对应API:{@link http://open.tietuku.com/doc#list-getrandrec}
  172. *
  173. * @access public
  174. * @param int $cid 类型ID。
  175. * @param boolean $createToken 是否只返回Token,默认为false。
  176. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  177. */
  178. public function getRandRecByCid($cid, $createToken = false)
  179. {
  180. $url = $this->host . "/List/";
  181. $param['deadline'] = time() + $this->timeout;
  182. $param['action'] = 'getrandrec';
  183. $param['cid'] = $cid;
  184. $Token = $this->op_Token->dealParam($param)->createToken();
  185. $data['Token'] = $Token;
  186. return $createToken ? $Token : $this->post($url, $data);
  187. }
  188. /**
  189. * 根据 图片ID 查询相应的图片详细信息
  190. *
  191. * 对应API:{@link http://open.tietuku.com/doc#pic-getonepic}
  192. *
  193. * @access public
  194. * @param int $id 图片ID。
  195. * @param boolean $createToken 是否只返回Token,默认为false。
  196. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  197. */
  198. public function getOnePicById($id, $createToken = false)
  199. {
  200. $url = $this->host . "/Pic/";
  201. $param['deadline'] = time() + $this->timeout;
  202. $param['action'] = 'getonepic';
  203. $param['id'] = $id;
  204. $Token = $this->op_Token->dealParam($param)->createToken();
  205. $data['Token'] = $Token;
  206. return $createToken ? $Token : $this->post($url, $data);
  207. }
  208. /**
  209. * 根据 图片find_url 查询相应的图片详细信息
  210. *
  211. * 对应API:{@link http://open.tietuku.com/doc#pic-getonepic}
  212. *
  213. * @access public
  214. * @param string $find_url 图片find_url
  215. * @param boolean $createToken 是否只返回Token,默认为false。
  216. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  217. */
  218. public function getOnePicByFind_url($find_url, $createToken = false)
  219. {
  220. $url = $this->host . "/Pic/";
  221. $param['deadline'] = time() + $this->timeout;
  222. $param['action'] = 'getonepic';
  223. $param['findurl'] = $find_url;
  224. $Token = $this->op_Token->dealParam($param)->createToken();
  225. $data['Token'] = $Token;
  226. return $createToken ? $Token : $this->post($url, $data);
  227. }
  228. /**
  229. * 分页查询全部图片列表 每页30张图片
  230. *
  231. * 对应API:{@link http://open.tietuku.com/doc#list-getnewpic}
  232. *
  233. * @access public
  234. * @param int $page_no 页数,默认为1。
  235. * @param boolean $createToken 是否只返回Token,默认为false。
  236. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  237. */
  238. public function getNewPic($page_no = 1, $createToken = false)
  239. {
  240. $url = $this->host . "/List/";
  241. $param['deadline'] = time() + $this->timeout;
  242. $param['action'] = 'getnewpic';
  243. $param['page_no'] = $page_no;
  244. $Token = $this->op_Token->dealParam($param)->createToken();
  245. $data['Token'] = $Token;
  246. return $createToken ? $Token : $this->post($url, $data);
  247. }
  248. /**
  249. * 通过类型ID分页查询全部图片列表 每页30张图片
  250. *
  251. * 对应API:{@link http://open.tietuku.com/doc#list-getnewpic}
  252. *
  253. * @access public
  254. * @param int $cid 类型ID。
  255. * @param int $page_no 页数,默认为1。
  256. * @param boolean $createToken 是否只返回Token,默认为false。
  257. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  258. */
  259. public function getNewPicByCid($cid, $page_no = 1, $createToken = false)
  260. {
  261. $url = $this->host . "/List/";
  262. $param['deadline'] = time() + $this->timeout;
  263. $param['action'] = 'getnewpic';
  264. $param['cid'] = $cid;
  265. $param['page_no'] = $page_no;
  266. $Token = $this->op_Token->dealParam($param)->createToken();
  267. $data['Token'] = $Token;
  268. return $createToken ? $Token : $this->post($url, $data);
  269. }
  270. /**
  271. * 根据用户ID查询用户相册列表
  272. *
  273. * 对应API:{@link http://open.tietuku.com/doc#album-get}
  274. *
  275. * @access public
  276. * @param int $uid 用户ID
  277. * @param boolean $createToken 是否只返回Token,默认为false。
  278. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  279. */
  280. public function getAlbumByUid($uid = null, $createToken = false)
  281. {
  282. $url = $this->host . "/Album/";
  283. $param['deadline'] = time() + $this->timeout;
  284. $param['action'] = 'get';
  285. if (!empty($uid)) {
  286. $param['uid'] = $uid;
  287. }
  288. $Token = $this->op_Token->dealParam($param)->createToken();
  289. $data['Token'] = $Token;
  290. return $createToken ? $Token : $this->post($url, $data);
  291. }
  292. /**
  293. * 查询自己收藏的图片列表
  294. *
  295. * 对应API:{@link http://open.tietuku.com/doc#collect-getlovepic}
  296. *
  297. * @access public
  298. * @param int $page_no 页数,默认为1。
  299. * @param boolean $createToken 是否只返回Token,默认为false。
  300. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  301. */
  302. public function getLovePic($page_no = 1, $createToken = false)
  303. {
  304. $url = $this->host . "/Collect/";
  305. $param['deadline'] = time() + $this->timeout;
  306. $param['action'] = 'getlovepic';
  307. $param['page_no'] = $page_no;
  308. $Token = $this->op_Token->dealParam($param)->createToken();
  309. $data['Token'] = $Token;
  310. return $createToken ? $Token : $this->post($url, $data);
  311. }
  312. /**
  313. * 通过图片ID喜欢(收藏)图片
  314. *
  315. * 对应API:{@link http://open.tietuku.com/doc#collect-addcollect}
  316. *
  317. * @access public
  318. * @param int $id 图片ID。
  319. * @param boolean $createToken 是否只返回Token,默认为false。
  320. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  321. */
  322. public function addCollect($id, $createToken = false)
  323. {
  324. $url = $this->host . "/Collect/";
  325. $param['deadline'] = time() + $this->timeout;
  326. $param['action'] = 'addcollect';
  327. $param['id'] = $id;
  328. $Token = $this->op_Token->dealParam($param)->createToken();
  329. $data['Token'] = $Token;
  330. return $createToken ? $Token : $this->post($url, $data);
  331. }
  332. /**
  333. * 通过图片ID取消喜欢(取消收藏)图片
  334. *
  335. * 对应API:{@link http://open.tietuku.com/doc#collect-delcollect}
  336. *
  337. * @access public
  338. * @param int $id 图片ID。
  339. * @param boolean $createToken 是否只返回Token,默认为false。
  340. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  341. */
  342. public function delCollect($id, $createToken = false)
  343. {
  344. $url = $this->host . "/Collect/";
  345. $param['deadline'] = time() + $this->timeout;
  346. $param['action'] = 'delcollect';
  347. $param['id'] = $id;
  348. $Token = $this->op_Token->dealParam($param)->createToken();
  349. $data['Token'] = $Token;
  350. return $createToken ? $Token : $this->post($url, $data);
  351. }
  352. /**
  353. * 通过相册ID分页查询相册中的图片 每页30张图片
  354. *
  355. * 对应API:{@link http://open.tietuku.com/doc#list-album}
  356. *
  357. * @access public
  358. * @param int $aid 相册ID。
  359. * @param int $page_no 页数,默认为1。
  360. * @param boolean $createToken 是否只返回Token,默认为false。
  361. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  362. */
  363. public function getAlbumPicByAid($aid, $page_no = 1, $createToken = false)
  364. {
  365. $url = $this->host . "/List/";
  366. $param['deadline'] = time() + $this->timeout;
  367. $param['action'] = 'album';
  368. $param['aid'] = $aid;
  369. $param['page_no'] = $page_no;
  370. $Token = $this->op_Token->dealParam($param)->createToken();
  371. $data['Token'] = $Token;
  372. return $createToken ? $Token : $this->post($url, $data);
  373. }
  374. /**
  375. * 查询所有的分类
  376. *
  377. * 对应API:{@link http://open.tietuku.com/doc#catalog-getall}
  378. *
  379. * @access public
  380. * @param boolean $createToken 是否只返回Token,默认为false。
  381. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  382. */
  383. public function getCatalog($createToken = false)
  384. {
  385. $url = $this->host . "/Catalog/";
  386. $param['deadline'] = time() + $this->timeout;
  387. $param['action'] = 'getall';
  388. $Token = $this->op_Token->dealParam($param)->createToken();
  389. $data['Token'] = $Token;
  390. return $createToken ? $Token : $this->post($url, $data);
  391. }
  392. /**
  393. * 创建相册
  394. *
  395. * 对应API:{@link http://open.tietuku.com/doc#album-create}
  396. *
  397. * @access public
  398. * @param string $albumname 相册名称。
  399. * @param boolean $createToken 是否只返回Token,默认为false。
  400. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  401. */
  402. public function createAlbum($albumname, $createToken = false)
  403. {
  404. $url = $this->host . "/Album/";
  405. $param['deadline'] = time() + $this->timeout;
  406. $param['action'] = 'create';
  407. $param['albumname'] = $albumname;
  408. $Token = $this->op_Token->dealParam($param)->createToken();
  409. $data['Token'] = $Token;
  410. return $createToken ? $Token : $this->post($url, $data);
  411. }
  412. /**
  413. * 编辑相册
  414. *
  415. * 对应API:{@link http://open.tietuku.com/doc#album-editalbum}
  416. *
  417. * @access public
  418. * @param int $aid 相册ID。
  419. * @param string $albumname 相册名称。
  420. * @param boolean $createToken 是否只返回Token,默认为false。
  421. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  422. */
  423. public function editAlbum($aid, $albumname, $createToken = false)
  424. {
  425. $url = $this->host . "/Album/";
  426. $param['deadline'] = time() + $this->timeout;
  427. $param['action'] = 'editalbum';
  428. $param['aid'] = $aid;
  429. $param['albumname'] = $albumname;
  430. $Token = $this->op_Token->dealParam($param)->createToken();
  431. $data['Token'] = $Token;
  432. return $createToken ? $Token : $this->post($url, $data);
  433. }
  434. /**
  435. * 通过相册ID删除相册(只能删除自己的相册 如果只有一个相册,不能删除)
  436. *
  437. * 对应API:{@link http://open.tietuku.com/doc#album-delalbum}
  438. *
  439. * @access public
  440. * @param int $aid 相册ID。
  441. * @param boolean $createToken 是否只返回Token,默认为false。
  442. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  443. */
  444. public function delAlbum($aid, $createToken = false)
  445. {
  446. $url = $this->host . "/Album/";
  447. $param['deadline'] = time() + $this->timeout;
  448. $param['action'] = 'delalbum';
  449. $param['aid'] = $aid;
  450. $Token = $this->op_Token->dealParam($param)->createToken();
  451. $data['Token'] = $Token;
  452. return $createToken ? $Token : $this->post($url, $data);
  453. }
  454. /**
  455. * 通过一组图片ID 查询图片信息
  456. *
  457. * 对应API:{@link http://open.tietuku.com/doc#list-getpicbyids}
  458. *
  459. * @access public
  460. * @param mix $ids 图片ID数组。(1.多个ID用逗号隔开 2.传入数组)
  461. * @param boolean $createToken 是否只返回Token,默认为false。
  462. * @return string 如果$createToken=true 返回请求接口的json数据否则只返回Token
  463. */
  464. public function getPicByIds($ids, $createToken = false)
  465. {
  466. $stringid = '';
  467. if (is_array($ids)) {
  468. foreach ($ids as $k => $v) {
  469. $stringid .= $v . ',';
  470. }
  471. $stringid = substr($stringid, 0, -1);
  472. } else {
  473. $stringid = $ids;
  474. }
  475. $url = $this->host . "/List/";
  476. $param['deadline'] = time() + $this->timeout;
  477. $param['action'] = 'getpicbyids';
  478. $param['ids'] = $stringid;
  479. $Token = $this->op_Token->dealParam($param)->createToken();
  480. $data['Token'] = $Token;
  481. return $createToken ? $Token : $this->post($url, $data);
  482. }
  483. /**
  484. * 上传单个文件到贴图库
  485. *
  486. * 对应API:{@link http://open.tietuku.com/doc#upload}
  487. *
  488. * @access public
  489. * @param int $aid 相册ID
  490. * @param array $file 上传的文件。
  491. * @return string 如果$file!=null 返回请求接口的json数据否则只返回Token
  492. */
  493. public function uploadFile($aid, $file = null, $filename = null)
  494. {
  495. $url = $this->upload_host;
  496. $param['deadline'] = time() + $this->timeout;
  497. $param['aid'] = $aid;
  498. $Token = $this->op_Token->dealParam($param)->createToken();
  499. $data['Token'] = $Token;
  500. $data['file'] = '@' . $file . (empty($filename) ? '' : (';filename=' . $filename));
  501. return empty($file) ? $Token : $this->post($url, $data);
  502. }
  503. /**
  504. * 上传多个文件到贴图库
  505. *
  506. * 对应API:{@link http://open.tietuku.com/doc#upload}
  507. *
  508. * @access public
  509. * @param int $aid 相册ID
  510. * @param string $filename 文件域名字
  511. * @return mixed 返回请求接口的json 如果文件域不存在文件则返回NULL
  512. */
  513. public function curlUpFile($aid, $filename)
  514. {
  515. if (is_array($_FILES[$filename]['tmp_name'])) {
  516. foreach ($_FILES[$filename]['tmp_name'] as $k => $v) {
  517. if (!empty($v)) {
  518. $userfile = $_FILES[$filename]['name'][$k];
  519. $res[] = json_decode($this->uploadFile($aid, $v, $userfile));
  520. }
  521. }
  522. } else {
  523. $res = json_decode($this->uploadFile($aid, $_FILES[$filename]['tmp_name'], $_FILES[$filename]['name']));
  524. }
  525. return json_encode($res);
  526. }
  527. /**
  528. * 上传网络文件到贴图库 (只支持单个连接)
  529. *
  530. * 对应API:{@link http://open.tietuku.com/doc#upload-url}
  531. *
  532. * @access public
  533. * @param int $aid 相册ID
  534. * @param string $fileurl 网络图片地址
  535. * @return string 如果$fileurl!=null 返回请求接口的json数据否则只返回Token
  536. */
  537. public function uploadFromWeb($aid, $fileurl = null)
  538. {
  539. $url = $this->upload_host;
  540. $param['deadline'] = time() + $this->timeout;
  541. $param['aid'] = $aid;
  542. $param['from'] = 'web';
  543. $Token = $this->op_Token->dealParam($param)->createToken();
  544. $data['Token'] = $Token;
  545. $data['fileurl'] = $fileurl;
  546. return empty($fileurl) ? $Token : $this->post($url, $data);
  547. }
  548. /**
  549. * 对接口post数据
  550. *
  551. *
  552. * @access public
  553. * @param string $url 接口请求地址。
  554. * @param array $data 需要post的数据
  555. * @return string 返回的json数据
  556. */
  557. public function post($url, $post_data)
  558. {
  559. $ch = curl_init();
  560. curl_setopt($ch, CURLOPT_URL, $url);
  561. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  562. curl_setopt($ch, CURLOPT_TIMEOUT, $this->CURLtimeout);
  563. curl_setopt($ch, CURLOPT_POST, 1);
  564. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
  565. $output = curl_exec($ch);
  566. curl_close($ch);
  567. return $output;
  568. }
  569. }