Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2012
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.00 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <string>
  3. #include <cstring>
  4. #include <vector>
  5. #include <stdio.h>
  6. #include <cstdlib>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <arpa/inet.h>
  10. #include <netdb.h>
  11. #include <ctime>
  12. #include <map>
  13. #include <sstream>
  14. #include <algorithm>
  15.  
  16. using namespace std;
  17.  
  18. #define POST 0
  19. #define GET 1
  20. #define BUF_SIZE 1024
  21. #define PORT_HTTP 80
  22.  
  23. vector<int> rechercher(char* chaine, char* chaine2)
  24. {
  25.     vector<int> posis;
  26.     char *p = strstr(chaine, chaine2);
  27.     while(p != NULL)
  28.     {
  29.         posis.push_back(p++ - chaine);
  30.         p = strstr(p, chaine2);
  31.     }
  32.     return posis;
  33. }
  34.  
  35. class Requete
  36. {
  37.     public:
  38.         Requete()
  39.         {
  40.             m_type = POST;
  41.         }
  42.         Requete(const char* site, const char* page, int type=POST)
  43.         {
  44.             m_site = site;
  45.             m_page = page;
  46.             setConnexion(site, PORT_HTTP);
  47.             m_type = type;
  48.         }
  49.         void setType(int type)
  50.         {
  51.             m_type = type;
  52.         }
  53.         void setSite(const char* site)
  54.         {
  55.             m_site = site;
  56.             setConnexion(site, PORT_HTTP);
  57.         }
  58.         void setPage(const char* page)
  59.         {
  60.             m_page = page;
  61.         }
  62.         void ajouter(const char* param, const char* valeur)
  63.         {
  64.             m_parametres.push_back(param);
  65.             m_valeurs.push_back(valeur);
  66.         }
  67.         void ajouter(const char* tout)
  68.         {
  69.             m_tout = tout;
  70.         }
  71.         void setValeur(int id, const char* valeur)
  72.         {
  73.             m_valeurs[id] = valeur;
  74.         }
  75.         void setValeur(const char* param, const char* valeur)
  76.         {
  77.             for(int i=0; i<m_parametres.size(); i++)
  78.                 if(m_parametres[i] == param)
  79.                 {
  80.                     m_valeurs[i] = valeur;
  81.                     break;
  82.                 }
  83.         }
  84.         void setConnexion(const char* site, int port) //en cas de proxy par exemple
  85.         {
  86.             hostent *hostinfo = gethostbyname(site);
  87.             m_sin.sin_addr = *(in_addr *) hostinfo->h_addr;
  88.             m_sin.sin_port = htons(port);
  89.             m_sin.sin_family = AF_INET;
  90.         }
  91.         void setConnexion2(const char* ip, int port) //en cas de proxy par exemple
  92.         {
  93.             m_sin.sin_addr.s_addr = inet_addr(ip);
  94.             m_sin.sin_port = htons(port);
  95.             m_sin.sin_family = AF_INET;
  96.         }
  97.         void setCookies(const char* cookies)
  98.         {
  99.             m_cookies = cookies;
  100.         }
  101.         void envoyer()
  102.         {
  103.             int sock = socket(AF_INET,SOCK_STREAM,0);
  104.             char buffer[2][BUF_SIZE] = { {""}, {""} };
  105.             char str[2][BUF_SIZE] = { {""}, {""} };
  106.             sprintf(str[0], "%s %s HTTP/1.1\r\n", (m_type == POST) ? "POST" : "GET", m_page.c_str());
  107.             strcat(buffer[0], str[0]);
  108.             sprintf(str[0], "Host: %s\r\n", m_site.c_str());
  109.             strcat(buffer[0], str[0]);
  110.             strcat(buffer[0], "User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8\r\n");
  111.             strcat(buffer[0], "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
  112.             strcat(buffer[0], "Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n");
  113.             strcat(buffer[0], "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n");
  114.             strcat(buffer[0], "Keep-Alive: 115\r\n");
  115.             strcat(buffer[0], "Connection: keep-alive\r\n");
  116.  
  117.             if( !m_cookies.empty() )
  118.             {
  119.                 sprintf(str[0], "Cookie: %s\r\n", m_cookies.c_str());
  120.                 strcat(buffer[0], str[0]);
  121.             }
  122.  
  123.             if(m_type == POST)
  124.             {
  125.                 strcat(buffer[0], "Content-Type: application/x-www-form-urlencoded\r\n");
  126.                 if( !m_tout.empty() )
  127.                     strcat(buffer[1], m_tout.c_str());
  128.                 else
  129.                     for(int param=0; param<m_parametres.size(); param++)
  130.                     {
  131.                         sprintf(str[1], "%s=%s", m_parametres[param].c_str(), m_valeurs[param].c_str());
  132.                         if(param > 0)
  133.                             strcat(buffer[1], "&");
  134.                         strcat(buffer[1], str[1]);
  135.                     }
  136.  
  137.                 sprintf(str[0], "Content-Length: %d\r\n", strlen(buffer[1]));
  138.                 strcat(buffer[0], str[0]);
  139.             }
  140.  
  141.             strcat(buffer[0], "\r\n");
  142.  
  143.             if(m_type == POST)
  144.                 strcat(buffer[0], buffer[1]);
  145.  
  146.             connect(sock,(sockaddr *) &m_sin, sizeof(sockaddr));
  147.             send(sock, buffer[0], strlen(buffer[0]), 0);
  148.  
  149.             m_retour.clear();
  150.             int nb;
  151.             while((nb = recv(sock, buffer[0], BUF_SIZE-1, 0)) > 0)
  152.             {
  153.                 buffer[0][nb] = '\0';
  154.                 m_retour += buffer[0];
  155.  
  156.                 if( !rechercher((char*)m_retour.c_str(), "</html>").empty() )
  157.                     break;
  158.             }
  159.  
  160.             close(sock);
  161.         }
  162.  
  163.         string getRetour() const
  164.         {
  165.             return m_retour;
  166.         }
  167.  
  168.         string getPage() const
  169.         {
  170.             return m_page;
  171.         }
  172.  
  173.     private:
  174.         string m_site;
  175.         string m_page;
  176.         vector<string> m_parametres;
  177.         vector<string> m_valeurs;
  178.         string m_tout;
  179.         sockaddr_in m_sin;
  180.         string m_cookies;
  181.         string m_retour;
  182.         int m_type;
  183. };
  184.  
  185. string conversion(int x)
  186. {
  187.     ostringstream oss;
  188.     oss << x;
  189.     string y = oss.str();
  190.     return y;
  191. }
  192.  
  193. void actualiserPage(Requete& req, int id, int page)
  194. {
  195.     string x = "/node/"+conversion(id)+"?page="+conversion(page);
  196.     req.setPage( x.c_str() );
  197.     printf("%d %d\n", id, page);
  198. }
  199.  
  200. int compterPageTopic(map<string,int> &mymap, Requete& req, bool p)
  201. {
  202.     req.envoyer();
  203.     const string& r = req.getRetour();
  204.  
  205.     vector<int> posis = rechercher((char*)r.c_str(), "<span class=\"submitted\">");
  206.     vector<int> posis2 = rechercher((char*)r.c_str(), "</span>");
  207.  
  208.     for(int i=0, j=0; i<posis.size(); i++)
  209.     {
  210.         for(; posis2[j] < posis[i]; j++);
  211.         int k=posis2[j];
  212.         while(r[k--] != ' ');
  213.         const string &pseudo = r.substr(k+2, posis2[j]-k-2);
  214.         mymap[pseudo]++;
  215.     }
  216.  
  217.     if(p)
  218.     {
  219.         posis = rechercher((char*)r.c_str(), "\" title=\"Aller à la dernière page\"");
  220.         int nbPages = (posis.size() == 2) ? r[posis[1]-1]-'0' : 0;
  221.         return nbPages;
  222.     }
  223.     else
  224.         return 0;
  225. }
  226.  
  227. void compterTopic(map<string,int>& mymap, Requete& req, int id)
  228. {
  229.     actualiserPage(req, id, 0);
  230.     int nbPages = compterPageTopic(mymap, req, true) + 1;
  231.     for(int page = 1; page < nbPages; page++)
  232.     {
  233.         actualiserPage(req, id, page);
  234.         compterPageTopic(mymap, req, false);
  235.     }
  236. }
  237.  
  238. struct Machin
  239. {
  240.     string str;
  241.     int v;
  242.     Machin() {}
  243.     Machin(string str, int v) : str(str), v(v) {}
  244.     bool operator < (const Machin& M) const
  245.     {
  246.         return v > M.v;
  247.     }
  248. };
  249.  
  250. int main()
  251. {
  252.     vector<Machin> machins;
  253.     map<string,int> mymap;
  254.     map<string,int>::iterator it;
  255.     Requete req("www.prologin.org","",GET);
  256.     req.setCookies("SESSz099b99b9629cde7986fcdd9b082b95e=d015d1de885f452672ec9c0f86617a3a; has_js=1; __utma=69437137.1587749792.1330733373.1330787804.1330799422.4; __utmc=69437137; __utmz=69437137.1330733373.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=69437137.11.10.1330799422");
  257.  
  258.     int nbTopics;
  259.     printf("Dernier topic : ");
  260.     scanf("%d", &nbTopics);
  261.     for(int i=0; i<=nbTopics; i++)
  262.         compterTopic(mymap, req, i);
  263.  
  264.     for(it=mymap.begin(); it != mymap.end(); it++)
  265.         machins.push_back( Machin(it->first, it->second) );
  266.     sort(machins.begin(), machins.end());
  267.  
  268.     for(int i=0, j=1; i<machins.size(); i++)
  269.     {
  270.         if(machins[i].v != machins[j-1].v)
  271.             j = i+1;
  272.         printf("%d. %s (%d)\n", j, machins[i].str.c_str(), machins[i].v);
  273.     }
  274.  
  275.     return 0;
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement