淘寶的API有些是開放的,我查了一下所有類目的API是收費的,需要申請APIKey,然后調(diào)用對應(yīng)查詢接口,就能返回XML或JSON數(shù)據(jù)進(jìn)行自己的處理了。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)洞口免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
如果真是開發(fā)需要,就可以買淘寶的服務(wù)啊。
調(diào)用很簡單,比如taobao.itemcats.get 接口(獲取后臺供賣家發(fā)布商品的標(biāo)準(zhǔn)商品類目),如下Java代碼就返回結(jié)果了(前提是提供APIKey,需要申請審核)
TaobaoClient?client=new?DefaultTaobaoClient(url,?appkey,?secret);
ItemcatsGetRequest?req=new?ItemcatsGetRequest();
req.setFields("cid,parent_cid,name,is_parent");
req.setParentCid(50011999L);
req.setCids("18957,19562,");
ItemcatsGetResponse?response?=?client.execute(req);
另外,變通的方法是自己開發(fā)爬蟲,在淘寶頁面上抓取,但問題是得不到淘寶技術(shù)支持,比如淘寶改版后也得跟著改動爬蟲代碼。
據(jù)我的了解,淘寶初期是用sun公司提供的一套代碼實現(xiàn)的也就是java,后期應(yīng)該主要是java和php來實現(xiàn)的,c++應(yīng)該不可能有,因為c++不適合做網(wǎng)站,更適合做桌面應(yīng)用和大型游戲.
哈哈,這個用JS就能實現(xiàn),搞個類似定時器之類的東西,隔一會向服務(wù)器發(fā)個請求就行了,現(xiàn)在那些第三方瀏覽器不都有定時刷新的功能么。
話說網(wǎng)上真的好多啊...
package client;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ClientFrame extends JFrame{
private JTextArea allmsg;
private JTextField welcome,copyright,chatmsg;
private JButton send;
private JScrollPane js;
private boolean isConnected = true;
public DataOutputStream out;
public DataInputStream in;
public Socket s = null;
String nic; /* -- 保存用戶昵稱 --*/
/**
* 初始化客戶端資源
* 1.獲取從LoginFrame傳遞過來的參數(shù)
* 2.初始化界面元素
* 3.初始化通信所需要的資源 EG:輸入/輸出流(DataInputStream/DataOutputStream)
* */
public ClientFrame(String name,Socket socket)
{
this.setSize(310,660);
this.setLocation(290,50);
this.setTitle("聊天室客戶端"+name+"");/* -- 指定窗口的標(biāo)題 --*/
this.s = socket;/* -- 接收從LoginFrame中傳遞過來的Socket --*/
this.nic = name+" 說: ";
welcome = new JTextField(" "+name+" 歡迎您來到聊天室 ",100);
welcome.setBackground(Color.blue);
welcome.setEnabled(false);
copyright = new JTextField(" ----- all copyright @ TOP-king -----");
copyright.setEnabled(false);
allmsg = new JTextArea();
allmsg.setEditable(false);
allmsg.append(" 系統(tǒng)消息: 歡迎登錄在線聊天室 \n");
js = new JScrollPane(allmsg);//為JTextArea添加滾動條
chatmsg = new JTextField("在此輸入聊天信息");
chatmsg.addActionListener(new listen());
send = new JButton("發(fā)送");
send.addActionListener(new listen());/* -- 添加事件監(jiān)聽器 --*/
try {
out = new DataOutputStream(s.getOutputStream());
in = new DataInputStream(s.getInputStream());
} catch (IOException e) {JOptionPane.showMessageDialog(null, "系統(tǒng)異常","錯誤",JOptionPane.OK_CANCEL_OPTION);}
addcomponettocontainer();
/* -- 當(dāng)用戶關(guān)閉窗口時進(jìn)行相關(guān)的處理 eg:Socket Data(Input/Output)Stream 的關(guān)閉--*/
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we)
{
sendmsg("quitlogout");/* -- 向服務(wù)器端發(fā)送關(guān)閉信息 --*/
isConnected = false;
destory();/* -- 銷毀窗口資源 --*/
}
});
new Thread(new linread()).start();/* -- 啟動讀取信息線程 --*/
}
public void addcomponettocontainer()
{
Container c = this.getContentPane();
c.setLayout(null);
welcome.setBounds(75,10,150,20);
js.setBounds(10,50,280,500);
chatmsg.setBounds(10,560,180,30);
send.setBounds(220,560,70,30);
copyright.setBounds(10,600,280,20);
c.add(welcome);
c.add(js);
c.add(chatmsg);
c.add(send);
c.add(copyright);
this.setVisible(true);
this.setResizable(false);
}
class listen implements ActionListener
{
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==send||e.getSource()==chatmsg)
{
String msg = chatmsg.getText().trim();
if("".equals(msg))
{
JOptionPane.showMessageDialog(null,"發(fā)送信息不能為空!","錯誤",JOptionPane.OK_OPTION);
}
else
{sendmsg((new Date()).toLocaleString()+"\n"+nic+msg+"\n");chatmsg.setText("");}
}
}
}
/* -- 向服務(wù)器端發(fā)送信息 --*/
public void sendmsg(String m)
{
if(isConnected)//如果socket的輸出流沒關(guān)閉
{
try {
out.writeUTF(m);
} catch (IOException e) {
JOptionPane.showMessageDialog(null,"發(fā)送信息失敗!(系統(tǒng)異常)","錯誤",JOptionPane.OK_OPTION);
}
}
else
{
JOptionPane.showMessageDialog(null,"發(fā)送信息失敗!(服務(wù)器關(guān)閉/網(wǎng)絡(luò)故障)","錯誤",JOptionPane.OK_OPTION);
}
}
/* -- 讀取信息線程 --*/
class linread implements Runnable
{
public void run()
{
read();
}
public void read()
{
while(isConnected)
{
try {
String msg = in.readUTF();
if("SYSTEM_CLOSED".equals(msg))
{
JOptionPane.showMessageDialog(null,"讀取消息失敗(服務(wù)器關(guān)閉/網(wǎng)絡(luò)故障)!","錯誤",JOptionPane.OK_OPTION);
isConnected = false;
}
else
allmsg.append(msg+"\n");
} catch (IOException e) {
}
}//end while
JOptionPane.showMessageDialog(null,"讀取消息失敗(服務(wù)器關(guān)閉/網(wǎng)絡(luò)故障)!","錯誤",JOptionPane.OK_OPTION);
}//end read()
}
public void destory()
{
try {
this.out.close();
this.in.close();
this.s.close();
} catch (IOException e) {
}
this.dispose();
}
}
======================================================
package client;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class LoginFrame extends JFrame{
private JTextField name;
private JTextField ip;
private JButton ok,cancle;
public Socket socket;
public LoginFrame()
{
super("登錄框");
this.setSize(400,80);
this.setLocation(100,100);
name = new JTextField("昵稱");
ip = new JTextField("127.0.0.1");
ok = new JButton("登錄");
cancle = new JButton("取消");
ok.addActionListener(new listenEvent());
cancle.addActionListener(new listenEvent());
//建立容器
addcomponettocontainer();
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/**
* 建立容器及控件
*/
public void addcomponettocontainer()
{
Container c = this.getContentPane();
c.setLayout(null);
name.setBounds(10,10,100,30);
ip.setBounds(120,10,100,30);
ok.setBounds(230,10,70,30);
cancle.setBounds(310,10,70,30);
c.add(name);
c.add(ip);
c.add(ok);
c.add(cancle);
this.setVisible(true);
this.setResizable(false);
}
public class listenEvent implements ActionListener
{
public void actionPerformed(ActionEvent event) {
// TODO Auto-generated method stub
if(event.getSource()==ok)
{
String n = name.getText().trim();
String i = ip.getText().trim();
if("".equals(n)||"".equals(i))
{
JOptionPane.showMessageDialog(null,"昵稱、IP不能夠為空!","錯誤",JOptionPane.OK_OPTION);
}
else{login(n,i);}
}
if(event.getSource()==cancle)
{
name.setText("");
ip.setText("");
}
}
}
/**
* 進(jìn)行登錄
* @param name
* @param ip
*/
public void login(String name,String ip)
{
try {
socket = new Socket(ip,7777);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.writeUTF(name);
out.flush();//強(qiáng)制輸出緩存中的內(nèi)容
//out.close();
new ClientFrame(name,socket);
destroywindow();
} catch (UnknownHostException e) {
JOptionPane.showMessageDialog(null,"找不到主機(jī)地址(IP錯誤/網(wǎng)絡(luò)故障)!","錯誤",JOptionPane.OK_OPTION);
} catch (IOException e) {
}
}
public void destroywindow()
{
this.dispose();
}
public static void main(String[] args)
{
new LoginFrame();
}
}
==================================================
package server;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ServerFrame extends JFrame{
/**
*
*/
private static final long serialVersionUID = 1L;
private JTextArea allmsg;
private JTextField currnum,totalnum,copyright,chatmsg;
private JButton send;
private JScrollPane js;
int num1,num2,port;/* -- num1:當(dāng)前在線人數(shù) num2:總上線人數(shù) port:服務(wù)端口號 --*/
private ServerSocket ss;
ArrayListuser lists;//存放所有在線用戶
public ServerFrame()
{
super("聊天室服務(wù)器端");
this.setSize(310,660);
this.setLocation(200,50);
lists = new ArrayListuser();
num1 = num2 =0;
port = 7777;
currnum = new JTextField(" 當(dāng)前在線人數(shù): "+num1);
currnum.setEnabled(false);
totalnum = new JTextField(" 上線總?cè)藬?shù): "+num2);
totalnum.setEnabled(false);
copyright = new JTextField(" ----- all copyright @ TOP-king -----");
copyright.setEnabled(false);
allmsg = new JTextArea();
allmsg.append(" --------------- 系統(tǒng)消息 --------------\n");
allmsg.setEditable(false);
allmsg.setLineWrap(true); //允許自動換行
js = new JScrollPane(allmsg);//為JTextArea添加滾動條
chatmsg = new JTextField("在此輸入系統(tǒng)信息");
chatmsg.addActionListener(new ActionListener(){
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent arg0) {
String str = chatmsg.getText().trim();
if(!"".equals(str))
{sendmsg((new Date()).toLocaleString()+" -- 系統(tǒng)消息: "+str);chatmsg.setText("");}
else
JOptionPane.showMessageDialog(null, "消息不能為空","錯誤",JOptionPane.OK_OPTION);
chatmsg.setText("");/* -- 發(fā)送信息后,將輸入欄中的信息清空 -- */
}
});
send = new JButton("發(fā)送");
send.addActionListener(new ActionListener(){
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent arg0) {
String str = chatmsg.getText().trim();
if(!"".equals(str))
{sendmsg((new Date()).toLocaleString()+" -- 系統(tǒng)消息: "+str);chatmsg.setText("");}
else
JOptionPane.showMessageDialog(null, "消息不能為空","錯誤",JOptionPane.OK_OPTION);
chatmsg.setText("");/* -- 發(fā)送信息后,將輸入欄中的信息清空 -- */
}
});
//建立容器
addcomponettocontainer();
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we)
{
sendmsg("SYSTEM_CLOSED");/* -- 向客戶端發(fā)送服務(wù)器關(guān)閉信息 -- */
destory();
}
});
start(); /* -- 啟動連接服務(wù) -- */
}
public void addcomponettocontainer()
{
//Container建立容器
Container c = this.getContentPane();
c.setLayout(null);
currnum.setBounds(20,15,130,20);
totalnum.setBounds(155,15,125,20);
js.setBounds(10,50,280,500);
chatmsg.setBounds(10,560,180,30);
send.setBounds(220,560,70,30);
copyright.setBounds(10,600,280,20);
c.add(currnum);
c.add(totalnum);
c.add(js);
c.add(chatmsg);
c.add(send);
c.add(copyright);
this.setVisible(true);
this.setResizable(false);
}
/**
* start()方法監(jiān)聽客戶的連接
* 并且保存客戶端的相關(guān)信息EG:用戶昵稱、用戶所使用的Socket
* 用戶連接到服務(wù)器成功之后,將其保存到用戶列表中,并為該用戶啟動一個線程用于通信 */
@SuppressWarnings("deprecation")
public void start()
{
boolean isStarted = false;/* -- 用于標(biāo)記服務(wù)器是否已經(jīng)正常啟動 -- */
try {
this.ss = new ServerSocket(port);
isStarted = true;
this.allmsg.append((new Date()).toLocaleString()+" 服務(wù)器啟動 @ 端口: "+port+"\n");
while(isStarted)
{
Socket client = this.ss.accept(); /* -- 監(jiān)聽客戶端的連接 -- */
DataInputStream in = new DataInputStream(client.getInputStream());
String name = in.readUTF();
user u = new user();
u.name = name;
u.socket = client;
lists.add(u); //將該用戶加到列表中去
num1++;
num2++;
currnum.setText(" 當(dāng)前在線人數(shù): "+num1);
totalnum.setText(" 上線總?cè)藬?shù): "+num2);
this.allmsg.append((new Date()).toLocaleString()+" : "+u.name+" 登錄 \n");
new Thread(new ClientThread(u)).start();/* -- 為該用戶啟動一個通信線程 -- */
}
} catch (IOException e) {
System.out.println("服務(wù)器已經(jīng)啟動......");
System.exit(0);
}
}
/**
* 通信線程主要功能包括:
* 1.監(jiān)聽客戶端輸入的信息
* 2.將接收到的信息轉(zhuǎn)發(fā)給其他用戶 */
class ClientThread implements Runnable
{
user user = null;
boolean isConnected = true;
DataInputStream dis = null;
DataOutputStream dos = null;
public ClientThread(user u)
{
this.user = u;
try {
this.dis = new DataInputStream(this.user.socket.getInputStream());
this.dos = new DataOutputStream(this.user.socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run()
{
readmsg();
}
/* -- 讀取客戶的聊天信息 -- */
@SuppressWarnings("deprecation")
public void readmsg()
{
while(isConnected)
{
try {
String msg = dis.readUTF();
if("quitlogout".equals(msg))//當(dāng)用戶關(guān)閉客戶端窗口時,發(fā)送quit字符串 表示用戶已經(jīng)退出
{
num1--;
try{
this.dis.close();
this.dos.close();
this.user.socket.close();
this.isConnected = false;
}catch(IOException ioe)
{
ioe.printStackTrace();
}finally{
this.isConnected = false;
if(dis!=null) this.dis.close();
if(dos!=null) this.dos.close();
if(this.user.socket!=null) this.user.socket.close();
}
lists.remove(this.user);//從列表中刪除該用戶
currnum.setText(" 當(dāng)前在線人數(shù): "+num1);
allmsg.append((new Date()).toLocaleString()+" : "+this.user.name+" 退出\n");
}
else
sendmsg(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/* -- 將信息進(jìn)行轉(zhuǎn)發(fā) -- */
public void sendmsg(String msg)
{
user us = new user();
DataOutputStream os = null;
if(lists.size()0)
{
for(int i=0;ilists.size();i++)
{
us = lists.get(i);
try {
os = new DataOutputStream(us.socket.getOutputStream());
os.writeUTF(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
else
JOptionPane.showMessageDialog(null, "當(dāng)前無用戶在線。發(fā)送消息失敗","失敗",JOptionPane.OK_OPTION);
}
public void destory()
{
try {
this.ss.close();
} catch (IOException e) {
e.printStackTrace();
}
this.dispose();
}
public static void main(String[] args)
{
new ServerFrame();
}
}
=================================================
package server;
import java.net.*;
public class user {
String name;
Socket socket;
}