最近比較流行短網址,所謂短網址,就是通過算法把長網址轉換成短字符,然後映射到短網址服務器緩存或數據庫裏。當訪問短網址的時候自動從數據庫裏取出映射的原網址。
這樣一來短網址的好處就凸顯出來,第一是短小好記,一次映射後就永久固定不變;
第二就是發佈微博/說說/狀態的時候有字數限制,如果需要發佈一個網址就會佔據一半以上的字符量,轉換成短網址可以剩餘更多字符。或者在文章/貼吧/等等需要防屏蔽或不希望網址太長的地方,使用短網址只需要添加一點額外字符就可以了;
第三因爲通過了映射服務器,所以可以查看通過此短網址訪問原網址的PV,UV等信息,達到統計的目的。一般是在短網址後加特定字符就可以進入後臺管理,例如126.am的‘+’,goo.gl的'qz'(貌似是這個?) //據說是互聯網上最穩定、最安全和最快速的網址縮短服務。谷歌的大牛 ( ̄︶ ̄)。
By the way,貌似淘寶客這種東西的操作模式有點像,通過後臺映射一個自己的淘寶客鏈接,類似的可以查看淘寶客鏈接的成交信息,從而給淘寶客分成盈利。至於各種美麗說,蘑菇街,返利網神馬的,都是大淘寶客,搭建自己的平臺,掛滿淘寶客鏈接,他賺十元返你一元你還高興得很,說明賣家賺的更多,可以推測這個東西成本價不知道多低,質量不曉得好差。。。所以淘寶就是個坑!天坑!遠離淘寶,珍愛生命!咳咳。。扯遠了。。雖然我也用淘寶,再打個廣告——我的淘寶店鋪,非淘寶客鏈接喲親~ ~~~~~ http://rrurl.cn/l7Izvh
盈所以快去搶注短網址吧~支持自定義~這個很爽誒~定義自己名字生日XXXXXX那啥的~~~~
短網址算法:
其實短網址的算法跟我們倒沒啥關係,因爲沒有服務器搭建算出來也沒用,而且最重要的是這種簽名拉~校驗拉~算法拉~Hash拉~數學拉什麼的。。。正常人是絕對不會感興趣的。。。。。簡而言之,就是通過MD5算法生成簽名,然後劃分爲4段,再進行位運算,再進行字母表索引得到特定字符,最後會生成4個6位字符串,取其中任意一個作爲當前短網址。至於重複的問題,首先這個算法算出來以後重複概率應該不高?(咳咳,其實我也不知道高不高,不過每位有26+26+10應該是重複概率很低咯),如果遇到重複的就取另外的字符串嘛,反正先到先得,先映射了的就不用管了。
短網址接口:
騰訊: url.cn
網易:126.am
新浪: t.cn
人人: rrurl.cn
百度:dwz.cn
第一家提供短網址服務的公司: tinyurl.cn
一般短網址接口的使用方法都是POST參數到服務器,然後服務器返回信息。不過找了下貌似很多都沒有開放接口,有的網站開放了接口但是參數裏必須要求有用戶登陸啊,用戶授權神馬的。所以還是萌萌的度娘好,完全免費調用,參數乾淨明朗。而且度娘之前就搞過短網址服務不過由於域名實在太長,被稱爲網址最長的短網址服務。所以後來悄悄收購了dwz.cn的域名重新低調上線,真是難爲度娘了。度娘不哭~~站起來X。
1、生成短網址
請求:向dwz.cn/create.php發送post請求,發送數據包括url=長網址
返回:json格式的數據
1、status!=0 出錯,查看err_msg獲得錯誤信息(UTF-8編碼)
2、成功,返回生成的短網址 tinyurl字段 2、自定義短網址
請求:向dwz.cn/create.php發送post請求,發送數據包括url=長網址&alias=自定義網址
返回:json格式的數據
1、Status!=0 出錯,查看err_msg獲得錯誤信息(UTF-8編碼)
2、成功,返回生成的短網址 tinyurl字段
HTTP請求:
一般短網址接口的使用方法都是POST參數到服務器,然後服務器返回信息。不過找了下貌似很多都沒有開放接口,有的網站開放了接口請求參數要求用戶的授權或登陸。客戶端(可以是瀏覽器,其他應用程序)與服務器進行交互,必須要發送請求,這裏用的是HTTP協議。常用的一般是GET請求和POST請求,簡單來說兩種請求方式基本相同,都是提交數據到服務器。區別在於GET方法是通過URL來提交數據,服務器從收到的URL裏解析數據,這樣做從安全角度來講要低一些,而且不能提交大量的數據。POST方法是通過加密的表單方式傳送,所以數據量可以比較大且安全。像QQ空間,人人的訪問應該就是發送的GET請求,從URL欄就可以直觀看到相應的參數如帳號,當前目錄是相冊還是日誌等等,而密碼註冊一類的都是POST請求。
就實際代碼來看,java的請求比較簡單,一些腳本語言也應該比較簡單。java裏使用封裝好的URL,URLCONNECTION可以輕鬆請求到數據。而VC就特別的麻煩(而且類種類繁多,參數繁多,步驟繁多,總而言之也是個天坑!)。
1、通過CInternetSession建立會話
2、準備好各參數,數據報頭部,裏面包含協議方式,接收編碼,請求方式等等
3、通過CHttpConnection建立連接
4、通過CHttpFile建立讀寫文件pfile
5、 使用pfile來OpenRequest,SendRequest
6、讀取返回數據,關閉連接
VC是天坑。。。。。還可以用其他API,WINHTTP包,TCP/IP。。。。不過每種都很複雜麻煩而且攪在一堆
JAVA 在網絡方面確實很方便:
/*****************************
* 逸雨清風出品
* 淘寶店鋪名:逸雨清風書屋,出售電子書,編程,解決電腦問題
* 新浪微博:仁壽府府尹
* CSDN:http://blog.csdn.net/xyydyyqf
* DATE: 2013-6-1
* 祝我兒童節快樂!
******************************/
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.security.acl.Owner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class dwz extends JFrame implements ActionListener
{
private static char[] shortdwz = new char[100];
private static char[] line2;
private static String line;
private static char[] suitable;
private JPanel panel;
private JButton btncreat,btnclear,btncopy;
private JLabel lbllong,lblshort,lblcopy,lblmyshort,lblhelp;
private JTextField txtlong;
private JTextField txtshort;
private JTextField txtmyshort;
public dwz()
{
super("短網址生成器");
panel = new JPanel();
lbllong = new JLabel("原網址");
lblshort = new JLabel(" 短網址");
lblcopy = new JLabel("等待複製");
lblmyshort = new JLabel("自定義 http://dwz.cn/");
lblhelp = new JLabel("字母,數字,破折號");
txtlong = new JTextField(30);
txtshort = new JTextField(22);
txtmyshort = new JTextField(14);txtmyshort.setText("");
txtlong.setHorizontalAlignment(SwingConstants.LEFT);
txtshort.setHorizontalAlignment(SwingConstants.LEFT); //左對齊
btncreat = new JButton("生成");
btnclear = new JButton("清空");
btncopy = new JButton("複製網址");
panel.add(lbllong);panel.add(txtlong);
panel.add(lblmyshort);panel.add(txtmyshort);panel.add(lblhelp);
panel.add(lblshort);panel.add(txtshort);panel.add(btncopy);
panel.add(btncreat);panel.add(btnclear);panel.add(lblcopy);
txtlong.addKeyListener(new KeyEnterLisener());
txtmyshort.addKeyListener(new KeyEnterLisener());
btncreat.addActionListener(this);
btnclear.addActionListener(this);
btncopy.addActionListener(this);
this.add(panel);
this.setSize(400,165);
this.setLocationRelativeTo(null);
this.setResizable(false);
}
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if (source == btncreat)
{
if (txtmyshort.getText().equals(""))
txtshort.setText(Getdwz(txtlong.getText()));
else txtshort.setText(GetMydwz(txtlong.getText(),txtmyshort.getText()));
}
if (source == btnclear)
{
txtshort.setText("");
txtlong.setText("");
txtmyshort.setText("");
lblcopy.setText("等待複製");
line = null; line2 = null;
}
if (source == btncopy)
{
Clipboard clipboard = getToolkit().getSystemClipboard(); //獲得系統剪切板
StringSelection stringSelection = new StringSelection(txtshort.getText());
clipboard.setContents(stringSelection,null);
lblcopy.setText("複製成功");
}
}
public class KeyEnterLisener extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_ENTER)
if (txtmyshort.getText().equals(""))
txtshort.setText(Getdwz(txtlong.getText()));
else txtshort.setText(GetMydwz(txtlong.getText(),txtmyshort.getText()));
}
}
public static String Getdwz(String longwz)
{
try {
String strurl = "url="+longwz;
URL url = new URL("http://dwz.cn/create.php"); //偉大的度娘,無需用戶登陸授權就可直接調用API
//URL url = new URL("http://126.am/api!shorten.action"); 網易的API必須另外要用戶的key做參數,其他門戶沒有找到公開的API
URLConnection connection = url.openConnection(); //打開url連接
connection.setDoOutput(true); //設置爲輸出
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.write(strurl); //寫入短網址到PORT請求
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while ((line = in.readLine())!= null) //得到返回的信息
{
line2 = line.toCharArray();
}
for (int i=0;i<line2.length;i++)
if (line2[i] == 'h')
{
int k=i,j;
for (j=0;line2[k]!='"';j++)
{
if (line2[k] != '\\') shortdwz[j] = line2[k];
else j--;
k++;
}
suitable = new char[j];
for (int temp=0;temp<j;temp++)
suitable[temp] = shortdwz[temp];
System.out.println(suitable);
break;
}
} catch (Exception e) {
System.out.println("發送POST請求出現異常!" + e);
e.printStackTrace();
}
if (shortdwz[7]!='d' || shortdwz[8]!='w' || shortdwz[9]!='z')
{
JOptionPane.showMessageDialog(null,"原網址輸入錯誤或無效!","錯誤",JOptionPane.ERROR_MESSAGE);
return null;
}
line =new String(suitable);
return line;
}
public static String GetMydwz(String longwz,String myshort)
{
try {
String strmyurl = "url="+longwz+"&alias="+myshort;
URL url = new URL("http://dwz.cn/create.php"); //偉大的度娘,無需用戶登陸授權就可直接調用API
URLConnection connection = url.openConnection(); //打開url連接
connection.setDoOutput(true); //設置爲輸出
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.write(strmyurl); //寫入短網址到PORT請求
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while ((line = in.readLine())!= null) //得到返回的信息
{
line2 = line.toCharArray();
}
for (int i=0;i<line2.length;i++)
if (line2[2] == 's' && line2[3] == 't' && line2[4] == 'a' && line2[5] == 't')
{
JOptionPane.showMessageDialog(null,"哦豁,運氣撇,被人捷足先登了\n這個短網址已經被定義過了或不合法,","哦豁",JOptionPane.ERROR_MESSAGE);
return null;
}
else if (line2[2] == 'e' && line2[3] == 'r' && line2[4] == 'r')
{
JOptionPane.showMessageDialog(null,"哦豁,運氣撇,被人捷足先登了\n這個長網址已經映射其他短網址了,","哦豁",JOptionPane.ERROR_MESSAGE);
return null;
}
else if (line2[i] == 'h' )
{
int k=i,j;
for (j=0;line2[k]!='"';j++)
{
if (line2[k] != '\\') shortdwz[j] = line2[k];
else j--;
k++;
}
shortdwz[j] = '\0';
break;
}
} catch (Exception e) {
e.printStackTrace();
}
if (shortdwz[7]!='d' || shortdwz[8]!='w' || shortdwz[9]!='z')
{
JOptionPane.showMessageDialog(null,"原網址輸入錯誤或無效!","錯誤",JOptionPane.ERROR_MESSAGE);
return null;
}
line =new String(shortdwz);
return line;
}
public static void main(String[] args) throws Exception
{
new dwz().setVisible(true);
}
}
VS10一如既往的天坑,尤其是調用系統API的時候:
//VC發送POST請求的時候始終有異常,暫未處理
/*****************************
* 逸雨清風出品
* 淘寶店鋪名:逸雨清風書屋,出售電子書,編程,解決電腦問題
* 新浪微博:仁壽府府尹
* CSDN:http://blog.csdn.net/xyydyyqf
* DATE: 2013-6-2
******************************/
#include "stdafx.h"
#include "dwz.h"
#include "afx.h"
#include <afxinet.h>
BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
BOOL Main_OnInitDialog(HWND hWnd,HWND hWndFocus,LPARAM lParam);
void Main_OnCommand(HWND hWnd,int id,HWND hwndCtl,UINT codeNotify);
void Main_OnClose(HWND hWnd);
char* Getdwz(CString longwz);
char* Getmydwz(CString longwz,CString myshortwz);
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAINDIALOG),NULL,Main_Proc);
return 0;
}
BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
//開始消息測試
HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);
HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);
//結束消息測試
}
return FALSE;
}
BOOL Main_OnInitDialog(HWND hWnd,HWND hwndFocus,LPARAM lParam)
{
//設置應用程序圖標
HICON hIcon = LoadIcon((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDI_ICON3));
SendMessage(hWnd,WM_SETICON,TRUE,(LPARAM)hIcon);
SendMessage(hWnd,WM_SETICON,FALSE,(LPARAM)hIcon);
//添加初始化代碼
return TRUE;
}
//主窗口關閉
void Main_OnClose(HWND hWnd)
{
EndDialog(hWnd,0);
}
//主窗口命令響應
void Main_OnCommand(HWND hWnd,int id,HWND hwndCtl,UINT codeNotify)
{
switch(id)
{
case IDCREAT:
char *longwz,*myshortwz,*shortwz;
ZeroMemory(longwz,sizeof(longwz));
ZeroMemory(myshortwz,sizeof(myshortwz));
ZeroMemory(shortwz,sizeof(shortwz));
GetDlgItemText(hWnd,IDC_LONG,longwz,sizeof(longwz));
GetDlgItemText(hWnd,IDC_MYSHORT,myshortwz,sizeof(myshortwz));
if (myshortwz == NULL) shortwz = Getdwz(longwz);
else shortwz = Getmydwz(longwz,myshortwz);
SetDlgItemText(hWnd,IDC_SHORT,shortwz);
break;
case IDCLEAR:
SetDlgItemText(hWnd,IDC_SHORT,"");
SetDlgItemText(hWnd,IDC_LONG,"");
SetDlgItemText(hWnd,IDC_MYSHORT,"");
break;
case IDCOPY:
char* source;
GetDlgItemText(hWnd,IDC_SHORT,source,sizeof(source));
if(OpenClipboard(NULL))
{
/*HGLOBLA clipbuffer;
char *buffer;
EmptyClipboard();
clipbuffer=GlobalAlloc(GMEM_DDESHARE,source.GetLength()+1);
buffer=(char *)GlobalLock(clipbuffer);
strcpy(buffer,LPCSTR(source));
GlobalUnLock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();*/
}
break;
default:break;
}
}
char* Getdwz(CString longwz)
{
char chHeader[128];
char chData[128];
char tChars[128];
memset(tChars,0,128);
CInternetSession session;
CHttpConnection* pConnection=NULL;
CHttpFile* pFile=NULL;
INTERNET_PORT nPort=8080;
strcpy(chHeader,"Content-Type: application/x-www-form-urlencoded");
strcpy(chData,"url=");
strcat(chData,longwz);
pConnection = session.GetHttpConnection("http://dwz.cn",nPort);
pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,"/create.php");
pFile->SendRequest(chHeader,(DWORD)strlen(chHeader),(LPVOID *)chData,strlen(chData));
pFile->Read(tChars,128);
session.Close();
char* shortdwz;
ZeroMemory(shortdwz,sizeof(shortdwz));
for (int i=0;i<sizeof(tChars);i++)
if (tChars[i] == 'h')
{
int k=i,j;
for (j=0;tChars[k]!='"';j++)
{
if (tChars[k] != '\\') shortdwz[j] = tChars[k];
else j--;
k++;
}
shortdwz[j] = '\0';
break;
}
if (shortdwz[7]!='d' || shortdwz[8]!='w' || shortdwz[9]!='z')
{
MessageBox(NULL,"原網址輸入錯誤或無效!","錯誤",MB_ICONINFORMATION|MB_OK);
return NULL;
}
return shortdwz;
}
char* Getmydwz(CString longwz,CString myshortwz)
{
char chHeader[128];
char chData[128];
char tChars[128];
memset(tChars,0,128);
CInternetSession session;
CHttpConnection* pConnection=NULL;
CHttpFile* pFile=NULL;
INTERNET_PORT nPort=8080;
strcpy(chHeader,"Content-Type: application/x-www-form-urlencoded");
strcpy(chData,"url=");
strcat(chData,longwz);
strcat(chData,"&alias=");
strcat(chData,myshortwz);
pConnection = session.GetHttpConnection("http://dwz.cn",nPort);
pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,"/create.php");
pFile->SendRequest(chHeader,(DWORD)strlen(chHeader),(LPVOID *)chData,strlen(chData));
pFile->Read(tChars,128);
session.Close();
char* shortdwz;
ZeroMemory(shortdwz,sizeof(shortdwz));
for (int i=0;i<sizeof(tChars);i++)
if (tChars[2] == 's' && tChars[3] == 't' && tChars[4] == 'a' && tChars[5] == 't')
{
MessageBox(NULL,"哦豁,運氣撇,被人捷足先登了\n這個短網址已經被定義過了或不合法,","哦豁",MB_ICONINFORMATION|MB_OK;
return NULL;
}
else if (tChars[2] == 'e' && tChars[3] == 'r' && tChars[4] == 'r')
{
MessageBox(NULL,"哦豁,運氣撇,被人捷足先登了\n這個長網址已經映射其他短網址了,","哦豁",MB_ICONINFORMATION|MB_OK);
return NULL;
}
else if (tChars[i] == 'h')
{
int k=i,j;
for (j=0;tChars[k]!='"';j++)
{
if (tChars[k] != '\\') shortdwz[j] = tChars[k];
else j--;
k++;
}
shortdwz[j] = '\0';
break;
}
if (shortdwz[7]!='d' || shortdwz[8]!='w' || shortdwz[9]!='z')
{
MessageBox(NULL,"原網址輸入錯誤或無效!","錯誤",MB_ICONINFORMATION|MB_OK);
return NULL;
}
return shortdwz;
}
傲嬌的僞生日自定義地址:http://dwz.cn/19930622 //java源代碼與JVM下可執行JAR
隨想
|| 發神:
about mobile QQ2013:手機QQ最新版叫罵一片,不過除了罵點讓人不爽意外,有兩個功能倒確實挺牛叉的。像是文件傳輸,多客戶端互傳文件,這是要多牛叉的協議才能做到,手機上可能還要針對不同的機型,不曉得有沒得抽象出來的包。還有一個功能就是聊天信息同步。當手機登陸服務器的時候,自動掃描當前在線的客戶端,而且這些客戶端的聊天信息都是同步到服務器上的,再由服務器統一下發比如最近一小時的記錄到所有客戶端。說明騰訊的服務器機制很牛叉,不曉得又是好多根頭髮好多杯咖啡泡出來的,真是企鵝中的戰鬥雞。(不過這也同樣說明聊天要河蟹
- - 騰訊把我們看得赤裸裸的,就連傳個在線文件說不定他都有截取一份)
遊戲外掛:說到外掛,不得不提易語言這種神奇的東西,這種傳說中的東東貌似專門爲外掛做後臺,盜號,木馬,病毒神馬的都少不了它~~~一般外掛就是對指定進程的數據,內存進行操作。捕獲了當前的進程,對它進行一些原本沒有的操作。像找茬遊戲外掛神馬的,捕獲它的進程,獲取到遊戲裏的兩幅圖像,再根據圖形算法,將圖片劃分爲N塊像素塊,用各點像素值的和計算每塊像素塊的值,再比較兩張圖片不同的像素塊,當差別超過預設的誤差範圍,則可以判定當前像素塊不同,通過寫操作繪圖對用戶做出提示。至於N的值和預設的誤差值是多少要看具體情況修改。像連連看這種估計也差不多,可能要用到Windows鉤子,還要進行鼠標模擬操作。
網絡協議:一般百度的時候URL裏就有wd=“搜索的值“,應該就是GET請求的數據直接通過URL傳送,然後百度服務器進行響應返回這個頁面。其他很多地方的網址都有這樣的效果,或是XML的解析。騰訊用的是UDP的協議,所以有離線的功能咪。
雲:好流行啊好流行,都在做雲,不管是搞存儲的還是搞安全的,不過爲毛感覺就是以前的服務器,換了個馬甲就爬出來裝新造勢咪。不過這些網站真心好有錢就是了,隨隨便便一個用戶就是免費送10個G,●﹏●
,雖然我不用。。。雲來雲去還不是要用網速下,就是服務器網盤嘛,慢得很。
自動回覆腳本:這個好啊!其實我超想搞這個的,像是現在的微博,人人,小黃雞,貼吧都是這種腳本。人人的應該是專門註冊一個帳號,然後關注了很多公共主頁,然後搭建一個個人電腦服務器,當服務器電腦開啓的時候,上傳到服務器上的腳本就開始工作,用監聽的方式注意所有主頁,一旦有主頁有消息更新就回復內容搶沙發,至於回覆的內容還可以隨機值/調用其他接口/固定值/圈人。至於微博就是那些打廣告的,自動掃描所有用戶,類似一個爬蟲腳本吧,蔓延在整個微博,設定好了關注的關鍵字,像是"減肥、痘痘、淘寶"什麼的,就自動給該用戶留言打廣告,廣告內容根據抓取的該用戶關鍵字而不同。貼吧應該也差不多,不過要解決驗證碼的問題。小黃雞應該是有一個數據庫,呃。。。腫麼讓我想起了清華大學的機器人小圖,跟小黃雞應該是差不多的吧,屬於自然語言處理。通過算法分析用戶輸入的語句語境,然後收集用戶回覆的話加入到數據庫,當有相同類似的對話的時候就可以調用收集到的話了,很高端的樣子膩~還是多客戶端的膩親~~而且數據選擇多了還可以隨機選擇一種回覆使得回覆不那麼單調。
好吧
( ̄▽ ̄) 所謂隨想就是隨便想的,完全木有理論依據的,認真你就輸了,哦嚯嚯嚯。當隨筆記下來了,以後有實際想法的再去一一實踐驗證。
/*
******逸雨清風 出品
******http://blog.csdn.net/xyydyyqf
*/