Neopets Mobile

From Computers Wiki
Revision as of 03:10, 21 May 2023 by Huntertur (talk | contribs) (→‎Both: Add other code snippet)
Jump to navigationJump to search

Neopets Mobile does not refer to the 2021 interface of the website, but the 2006 flip phone application that has long been discontinued.

Archival

https://www.jellyneo.net/?go=mobile

https://pinkpt.com//neodex/index.php?title=Neopets_Mobile

https://drive.google.com/file/d/1Cj8hqk4VI-O408kgMnKpffPmI-kxKmWR/view

Attempts to reverse engineer the long-defunct API

TODO (The jars are all minified, but perhaps I can extract the API URLs from them and document what the application expects to get back)

The META-INF/MANIFEST.MF for the Nokia 6280 version specifies a Java version of 1.4.2_04.

The decompiler used is quiltflower: https://github.com/QuiltMC/quiltflower and the javax.microedition classes were copied from https://github.com/mcpat/java-microedition-libraries

Nokia 6280 V02.30.00 (en) Singtel

m.java contains two calls:

The session check appears to return one of the following values, with anything else as a failure code of -1:

Response Treated as ID
SUBSCRIBED 1
UNSUBSCRIBED 2
REVOKED 3
SECURITY 5

Nokia 6111

m.java contains one call:

Both

In b.java for the 6280 version and m.java for the 6111 version, there is code for the following POST request (taken from the 6280 version):

   private static final void a(HttpConnection var0, p var1, boolean var2) throws IOException {
      var0.setRequestMethod("POST");
      var0.setRequestProperty("content-type", "application/x-www-form-urlencoded");
      var0.setRequestProperty("connection", "close");
      if (a != null) {
         var0.setRequestProperty("x-up-calling-line-id", a);
      }

      DataOutputStream var3 = var0.openDataOutputStream();
      if (var2) {
         a(var3, "session=" + b);
         a(var3, "&");
      }

      a(var3, "client=NEOPETS/2.8");
      a(var3, "&");
      a(var3, "game=" + c);
      if (a > 0) {
         a(var3, "&");
         a(var3, "center=" + a);
      }

      if (d != null) {
         a(var3, "&");
         a(var3, "language=" + d);
      }

      a(var3, "\n");
      var3.writeShort(var1.a);
      var3.writeInt(8 * var1.a());
      var1.a(var3);
      var3.writeShort(255);
      var3.close();
   }
   private static final h a(HttpConnection var0) throws IOException, o {
      int var1;
      if ((var1 = var0.getResponseCode()) != 200) {
         throw new o(var1, var0.getResponseMessage());
      } else {
         String var2;
         if ((var2 = var0.getType()) != null && var2.equals("application/x-www-form-urlencoded")) {
            DataInputStream var3;
            String var4;
            String var5;
            if ((var5 = a(var4 = a(var3 = var0.openDataInputStream()), "session")) != null) {
               b(var5);
            }

            String var6;
            if ((var6 = a(var4, "url")) != null) {
               e = var6;
            }

            int var7;
            if ((var7 = var3.read()) == true) {
               return new h(-1, new byte[0]);
            } else {
               int var8 = var7 << 8 | var3.readByte() & 255;
               byte[] var10 = new byte[(var3.readInt() + 7) / 8];
               var3.readFully(var10);
               if (var3.read() != -1) {
                  throw new o(500, "Too much data in response");
               } else {
                  var3.close();
                  if (var8 != 32768 && var8 != 32868) {
                     return new h(var8, var10);
                  } else {
                     throw new o(500, new String(var10, 1, var10.length - 1));
                  }
               }
            }
         } else {
            throw new o(500, "Invalid response Content-Type: " + var2);
         }
      }
   }