1
0

backend.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. class backend{
  3. public function __construct($scraper){
  4. $this->scraper = $scraper;
  5. }
  6. /*
  7. Proxy stuff
  8. */
  9. public function get_ip(){
  10. $pool = constant("config::PROXY_" . strtoupper($this->scraper));
  11. if($pool === false){
  12. // we don't want a proxy, fuck off!
  13. return 'raw_ip::::';
  14. }
  15. // indent
  16. $proxy_index_raw = apcu_inc("p." . $this->scraper);
  17. $proxylist = file_get_contents("data/proxies/" . $pool . ".txt");
  18. $proxylist = explode("\n", $proxylist);
  19. // ignore empty or commented lines
  20. $proxylist = array_filter($proxylist, function($entry){
  21. $entry = ltrim($entry);
  22. return strlen($entry) > 0 && substr($entry, 0, 1) != "#";
  23. });
  24. $proxylist = array_values($proxylist);
  25. echo $proxy_index_raw % count($proxylist);
  26. return $proxylist[$proxy_index_raw % count($proxylist)];
  27. }
  28. // this function is also called directly on nextpage
  29. public function assign_proxy(&$curlproc, $ip){
  30. // parse proxy line
  31. [
  32. $type,
  33. $address,
  34. $port,
  35. $username,
  36. $password
  37. ] = explode(":", $ip, 5);
  38. switch($type){
  39. case "raw_ip":
  40. return;
  41. break;
  42. case "http":
  43. case "https":
  44. curl_setopt($curlproc, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
  45. curl_setopt($curlproc, CURLOPT_PROXY, $type . "://" . $address . ":" . $port);
  46. break;
  47. case "socks4":
  48. curl_setopt($curlproc, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
  49. curl_setopt($curlproc, CURLOPT_PROXY, $address . ":" . $port);
  50. break;
  51. case "socks5":
  52. curl_setopt($curlproc, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
  53. curl_setopt($curlproc, CURLOPT_PROXY, $address . ":" . $port);
  54. break;
  55. case "socks4a":
  56. curl_setopt($curlproc, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4A);
  57. curl_setopt($curlproc, CURLOPT_PROXY, $address . ":" . $port);
  58. break;
  59. case "socks5_hostname":
  60. curl_setopt($curlproc, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
  61. curl_setopt($curlproc, CURLOPT_PROXY, $address . ":" . $port);
  62. break;
  63. }
  64. if($username != ""){
  65. curl_setopt($curlproc, CURLOPT_PROXYUSERPWD, $username . ":" . $password);
  66. }
  67. }
  68. /*
  69. Next page stuff
  70. */
  71. public function store($payload, $page, $proxy){
  72. $page = $page[0];
  73. $password = random_bytes(256); // 2048 bit
  74. $salt = random_bytes(16);
  75. $key = hash_pbkdf2("sha512", $password, $salt, 20000, 32, true);
  76. $iv =
  77. random_bytes(
  78. openssl_cipher_iv_length("aes-256-gcm")
  79. );
  80. $tag = "";
  81. $out = openssl_encrypt($payload, "aes-256-gcm", $key, OPENSSL_RAW_DATA, $iv, $tag, "", 16);
  82. $requestid = apcu_inc("requestid");
  83. apcu_store(
  84. $page . "." .
  85. $this->scraper .
  86. $requestid,
  87. gzdeflate($proxy . "," . $salt.$iv.$out.$tag),
  88. 900 // cache information for 15 minutes blaze it
  89. );
  90. return
  91. $this->scraper . $requestid . "." .
  92. rtrim(strtr(base64_encode($password), '+/', '-_'), '=');
  93. }
  94. public function get($npt, $page){
  95. $page = $page[0];
  96. $explode = explode(".", $npt, 2);
  97. if(count($explode) !== 2){
  98. throw new Exception("Malformed nextPageToken!");
  99. }
  100. $apcu = $page . "." . $explode[0];
  101. $key = $explode[1];
  102. $payload = apcu_fetch($apcu);
  103. if($payload === false){
  104. throw new Exception("The nextPageToken is invalid or has expired!");
  105. }
  106. $key =
  107. base64_decode(
  108. str_pad(
  109. strtr($key, '-_', '+/'),
  110. strlen($key) % 4,
  111. '=',
  112. STR_PAD_RIGHT
  113. )
  114. );
  115. $payload = gzinflate($payload);
  116. // get proxy
  117. [
  118. $proxy,
  119. $payload
  120. ] = explode(",", $payload, 2);
  121. $key =
  122. hash_pbkdf2(
  123. "sha512",
  124. $key,
  125. substr($payload, 0, 16), // salt
  126. 20000,
  127. 32,
  128. true
  129. );
  130. $ivlen = openssl_cipher_iv_length("aes-256-gcm");
  131. $payload =
  132. openssl_decrypt(
  133. substr(
  134. $payload,
  135. 16 + $ivlen,
  136. -16
  137. ),
  138. "aes-256-gcm",
  139. $key,
  140. OPENSSL_RAW_DATA,
  141. substr($payload, 16, $ivlen),
  142. substr($payload, -16)
  143. );
  144. if($payload === false){
  145. throw new Exception("The nextPageToken is invalid or has expired!");
  146. }
  147. // remove the key after using
  148. apcu_delete($apcu);
  149. return [$payload, $proxy];
  150. }
  151. }