Wednesday, March 16, 2005

ทดลอง Blogger API

ขอพักส่วน UI ของ LogAnalyzer ไว้ก่อน
เมื่อวานได้ปั่น version java swing ให้พอใช้งานได้เสร็จไปแล้ว
ไว้มีเวลาแล้วจะทดลองในส่วนของ jface, swt ต่อ

ย้อนกลับไปเมือวันอาทิตย์ได้ทดลองใช้ blogger api ดู
สืบเนื่องจากไม่ค่อยถูกใจ editor ที่ใช้ในปัจจุบัน
ก็เลยคิดจะหาทาง post เอง

เริ่มจากเข้าไปที่หน้า http://www.blogger.com/developers/
จะเห็นว่ามี api ให้เลือกอยู่ 2 ตัวก็คือ
  • Blogger API 1.0
  • Atom API


Blogger API
API ตัวนี้ใช้ XML-RPC ก็เลยไป load เอา
Apache XML-RPC มาทดลองใช้
เขียน Code แค่นี้ก็ post ได้แล้ว
  XmlRpcClient client = new XmlRpcClient
("http://plant.blogger.com/api/RPC2");
Vector args = new Vector();
args.add("0123456789ABCDEF"); // APP ID ปัจจุบัน blogger ไม่สนใจค่านี้แล้ว
args.add("11409654"); // blog id
args.add("pphetra"); // user id
args.add("***********"); // password
args.add("content .........");
args.add(Boolean.TRUE); // publish
try {
client.execute("blogger.newPost", args);
System.out.println(obj.getClass().getName());
} catch (Exception e) {
e.printStackTrace();
}

ง่ายดายมาก แต่ก็เจอปัญหาอยู่ 2 จุด
จุดที่ 1 คือ ไม่มี param blog title ให้ใช้
ค้นหาเอกสารพบว่า มีส่วนขยายที่ชื่อ MetaWebLog
ให้ใช้ (ไม่ได้ทดลองเพราะยังแก้ปัญหาจุดที่ 2 ไม่ได้)
จุดที่ 2 อันนี้ร้ายแรงหน่อย ก็คือ ส่งภาษาไทยไม่ได้
พอทดลองส่งภาษาไทยพบปัญหา
java.io.IOException: Invalid character data corresponding to XML entity ก
at org.apache.xmlrpc.XmlRpcClient$Worker.execute(XmlRpcClient.java:444)
at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:163)

ก็เลยไปดู source code พบว่า
default:
if (c < 0x20 || c > 0xff)
{
// Though the XML-RPC spec allows any ASCII
// characters except '<' and '&', the XML spec
// does not allow this range of characters,
// resulting in a parse error from most XML
// parsers.
throw new XmlRpcClientException("Invalid character data " +
"corresponding to XML entity &#" +
String.valueOf((int) c) + ';', null);
}
else
{
write(c);
}
}

ก็เลยสงสัยว่า แล้วพวกประเทศอื่นๆไม่มีใครเขาใช้ apache xml-rpc เลยหรือ
ก็เลยเข้าไปค้น issue ดูพบ
http://issues.apache.org/jira/browse/XMLRPC-45
ค่อยรู้สึกว่ามีเพื่อนหน่อย
จากนั้นก็เลยทำการ comment ประโยคที่ตรวจสอบออก
แล้วก็ build xml-rpc เอง
คราวนี้ส่งได้แล้ว แต่ฟัง blogger รับแล้วแสดงผลเป็น ?????
ก็เลยหมดปัญญา เพราะไม่รู้ว่าโปรแกรมฝั่งเขามีขบวนการ decode
อะไรแบบไหน ก็เปลี่ยนมาใช้ Atom api

Atom API
ตาม link ข้างบนไปจตถึงหน้านี้ http://atomenabled.org/developers/api/
เห็นมี WSDL ก็เลยกะว่าจะใช้ Apache AXIS
Generate Client code ให้
ทำการสั่ง wsdl2java พบปัญหา
C:\temp>java org.apache.axis.wsdl.WSDL2Java
http://atomenabled.org/developers/api/AtomAPI.wsdl
java.util.NoSuchElementException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:785)
at java.util.HashMap$ValueIterator.next(HashMap.java:812)

ค้นใน net พบ issue AXIS-249
ตกลงเป็นปัญหาที่ axis ไม่สามารถ generate operation ที่ไม่มี parameter ได้
(ดูแล้ว axis ก็ถูกนะจะมี web service ที่ไหน ที่ไม่ต้อง pass param ไปบ้าง)
คราวนี้ขี้เกียจ build axis ใหม่ ก็เลยใช้วิธี load เอา wsdl มาแก้ไข
โดยลบส่วน operation ที่ไม่มี parameter ออก
คราวนี้สามารถ generate source code ออกมาได้แล้ว
ทดลอง เขียนโปรแกรมดู
  AtomAPILocator locate = new AtomAPILocator();
AtomAPISoap api = locate.getAtomAPISoap(new
URL("http://www.blogger.com/atom/11409654"));
ContentType ct = new ContentType();
ct.setMode(ContentTypeMode.xml);
ct.setAny(.... (source code ตรงนี้แก้ไปแล้วเลยจำไม่ได้));

EntryType entry = new EntryType();

entry.setTitle("hello test");
entry.setIssued(new GregorianCalendar());
entry.setContent(new ContentType[] {ct});
api.POST(entry);

ส่งครั้งแรกไม่ผ่าน ติดปัญหา authenticate
ก็เลยไปแก้ source code ที่ axis gen ให้ เพิ่มส่วน
set user กับ password ลงไป
  org.apache.axis.client.Call _call = createCall();
_call.setUsername("pphetra");
_call.setPassword("*********");

คราวนี้ผ่าน step แรกแต่พบปัญหาว่ามันฟ้องเรื่อง
Malformed XML. Mode indicated was 'xml' but data was not xml

ก็เลยต้อง start tcpmon เพื่อดูว่า protocol ที่ส่งไปมีหน้าตาเป็นอย่างไร
ได้ความว่ามันส่งส่วน post แบบนี้
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<POST xmlns="http://schemas.xmlsoap.org/wsdl/http/">
<ns1:entry xmlns:ns1="http://purl.org/atom/ns#">
<ns1:title>hello test</ns1:title>
<ns1:generator xsi:nil="true"/>
<ns1:issued>2548-03-16T09:22:18.640Z</ns1:issued>
<ns1:content></ns1:content>
</ns1:entry>
</POST>
</soapenv:Body>
</soapenv:Envelope>

ก็เลยสงสัยว่าตัว content มันหาย
ก็เลยไป hack ส่วน code ที่ axis generate ออกมา
เขียนส่วน serializable ของ content เอง
ในที่สุดก็ได้ content ออกมา
แต่พอ run แล้วก็ยังได้ message เหมือนเดิม

ชักหมดแรง ลองมาหลายวิธีจนเหนื่อยแล้ว
(หมกมุ่นจนภรรยาเกิดอาการงอน)
พักไว้ก่อนดีกว่า

ปล. วันนี้ค้นเจอแล้วว่า format ที่ถูกเป็นอย่างไร
ตัวเอกสารอยู่ที่ atom-docs
ไม่เห็นมี SOAP แปะเลย แล้วมันจะมี WSDL ไว้ทำหยัง
ไว้ให้แฟนอารมณ์ดีแล้วค่อยลองใหม่

POST /atom/3187374 HTTP/1.1
Host: www.blogger.com
Authorization: BASIC c3RldmVqOm5vdGFyZWFscGFzc3dvcmQ=

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entry xmlns="http://purl.org/atom/ns#">
<title mode="escaped" type="text/plain">atom test</title>
<issued>2004-04-12T06:07:20Z</issued>
<generator url="http://www.yoursitesurlhere.com">Your client's name here.</generator>
<content type="application/xhtml+xml">
<div xmlns="http://www.w3.org/1999/xhtml">Testing the Atom API</div>
</content>
</entry>

Related link from Roti

No comments: